如果我并排放置两个调用以确定最小的可测量持续时间:
// g++ -std=c++11 -O3 -Wall test.cpp
#include <chrono>
typedef std::chrono::high_resolution_clock hrc;
hrc::time_point start = hrc::now();
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "duration: " << duration.count() << " ns" << std::endl;
我已经循环运行了数千次,并且在我的特定 3.40GHz 桌面上始终获得 40 ns +/- 2 ns。
但是,当我查看我可以睡觉的最短时间时:
#include <thread>
hrc::time_point start = hrc::now();
std::this_thread::sleep_for( std::chrono::nanoseconds(1) );
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "slept for: " << duration.count() << " ns" << std::endl;
这告诉我我平均睡了 55400 纳秒,即 55.4 微秒。比我预期的时间要长得多。
将上面的代码放入一个for()
循环中,我尝试了不同数量的睡眠,结果如下:
- sleep_for( 4000 ns ) => 睡了 58000 ns
- sleep_for( 3000 ns ) => 睡了 57000 ns
- sleep_for( 2000 ns ) => 睡了 56000 ns
- sleep_for( 1000 ns ) => 睡了 55000 ns
- sleep_for(0 ns) => 睡了 54000 ns
- sleep_for(-1000 ns) => 睡了 313 ns
- sleep_for(-2000 ns) => 睡了 203 ns
- sleep_for(-3000 ns) => 睡了 215 ns
- sleep_for(-4000 ns) => 睡了 221 ns
我有一些问题:
- 什么可以解释这些数字?
- 为什么睡眠时间为负数会返回 200+ ns,而睡眠时间为 0+ 纳秒会导致 50,000+ 纳秒?
- 作为睡眠时间的负数是记录/支持的功能,还是我不小心偶然发现了一些我无法依赖的奇怪错误?
- 有没有更好的 C++ 睡眠调用可以给我更一致/可预测的睡眠时间?