Revert chrono use

Summary:
For some reason, libstdc++ implements steady_clock::now() using syscall instead of VDSO optimized clock_gettime() when using glibc 2.16 and earlier. This leads to significant performance degradation for users with older glibcs. See bug reported here: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59177

We observed this behavior when testing mongo on AWS hosts. Facebook hosts are unaffected since we use glibc2.17 and 2.20.

Revert "Fix timing"
This reverts commit 965d9d50b8.

Revert "Use chrono for timing"
This reverts commit 001ce64dc7.

Test Plan: make check

Reviewers: MarkCallaghan, yhchiang, rven, meyering, sdong

Reviewed By: sdong

Subscribers: dhruba, leveldb

Differential Revision: https://reviews.facebook.net/D34371
main
Igor Canadi 10 years ago
parent db03739340
commit b8d23cdcb8
  1. 20
      util/env_posix.cc

@ -7,7 +7,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors. // found in the LICENSE file. See the AUTHORS file for names of contributors.
#include <chrono>
#include <deque> #include <deque>
#include <set> #include <set>
#include <dirent.h> #include <dirent.h>
@ -1400,13 +1399,24 @@ class PosixEnv : public Env {
} }
virtual uint64_t NowMicros() override { virtual uint64_t NowMicros() override {
return std::chrono::duration_cast<std::chrono::microseconds>( struct timeval tv;
std::chrono::system_clock::now().time_since_epoch()).count(); gettimeofday(&tv, nullptr);
return static_cast<uint64_t>(tv.tv_sec) * 1000000 + tv.tv_usec;
} }
virtual uint64_t NowNanos() override { virtual uint64_t NowNanos() override {
return std::chrono::duration_cast<std::chrono::nanoseconds>( #ifdef OS_LINUX
std::chrono::steady_clock::now().time_since_epoch()).count(); struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return static_cast<uint64_t>(ts.tv_sec) * 1000000000 + ts.tv_nsec;
#elif __MACH__
clock_serv_t cclock;
mach_timespec_t ts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &ts);
mach_port_deallocate(mach_task_self(), cclock);
#endif
return static_cast<uint64_t>(ts.tv_sec) * 1000000000 + ts.tv_nsec;
} }
virtual void SleepForMicroseconds(int micros) override { usleep(micros); } virtual void SleepForMicroseconds(int micros) override { usleep(micros); }

Loading…
Cancel
Save