对CLOCK_MONOTONIC_COARSE的Std :: chrono或boost :: chrono支持

时间:2014-09-23 19:41:29

标签: c++ c++11 boost time chrono

在Linux上运行(uname说:)

Linux 2.6.32-431.29.2.el6.x86_64 #1 SMP Sun Jul 27 15:55:46 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

我的测试表明,时钟ID为CLOCK_MONOTONIC_COARSE的clock_gettime调用比使用时钟ID CLOCK_MONOTONIC的调用快一个数量级。

这是测试运行的示例输出,在紧密循环中调用了clock_gettime一百万次,并以毫秒为单位测量了失效时间:

CLOCK_MONOTONIC lapse 795
CLOCK_MONOTONIC_COARSE lapse 27

这让我高兴并使得探查器结果看起来更好,但是我希望我可以使用std :: chrono或boost :: chrono来实现可移植性和标准一致性,而不会牺牲这个速度。不幸的是,我没有找到任何方法来说服chrono(任何一个)在CLOCK_MONOTONIC_COARSE可用时使用它。我试过chrono :: steady_clock,但结果与CLOCK_MONOTONIC值相当。

有没有办法指定你有时愿意牺牲精度以获得速度?

1 个答案:

答案 0 :(得分:3)

作为Howard said,您可以轻松制作自己的时钟 - 符合C ++ 11 Clock要求的类型 - 在CLOCK_MONOTONIC_COARSE可用时使用CLOCK_MONOTONICclass fast_monotonic_clock { public: using duration = std::chrono::nanoseconds; using rep = duration::rep; using period = duration::period; using time_point = std::chrono::time_point<fast_monotonic_clock>; static constexpr bool is_steady = true; static time_point now() noexcept; static duration get_resolution() noexcept; private: static clockid_t clock_id(); static clockid_t test_coarse_clock(); static duration convert(const timespec&); }; inline clockid_t fast_monotonic_clock::test_coarse_clock() { struct timespec t; if (clock_gettime(CLOCK_MONOTONIC_COARSE, &t) == 0) { return CLOCK_MONOTONIC_COARSE; } else { return CLOCK_MONOTONIC; } } clockid_t fast_monotonic_clock::clock_id() { static clockid_t the_clock = test_coarse_clock(); return the_clock; } inline auto fast_monotonic_clock::convert(const timespec& t) -> duration { return std::chrono::seconds(t.tv_sec) + std::chrono::nanoseconds(t.tv_nsec); } auto fast_monotonic_clock::now() noexcept -> time_point { struct timespec t; const auto result = clock_gettime(clock_id(), &t); assert(result == 0); return time_point{convert(t)}; } auto fast_monotonic_clock::get_resolution() noexcept -> duration { struct timespec t; const auto result = clock_getres(clock_id(), &t); assert(result == 0); return convert(t); } 否则(Live at Coliru):

{{1}}