如果我将两个调用放在一起来确定最小可测量的时间持续时间:
// 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 +纳秒?
- 将负数作为睡眠时间是一项记录/支持的功能,还是我意外地遇到了一些奇怪的bug,我不能依赖它?
- 有没有更好的C++睡眠调用可以给我更一致/可预测的睡眠时间?
nanosleep({0,1}, NULL)
所需的时间(如果你使用的是Linux)。 - Cubbisleep_for
会至少休眠指定的持续时间。如果您提供了一个负值,它就不需要休眠。sleep
是一个小众工具,尽管如此,你应该使用某种计时器机制(遗憾的是标准 C++ 没有任何计时器)。 - R. Martinho Fernandessleep_for
正在测量sleep_for
调用的开销: 不能期望它花费零时间,因为它必须检查是否应该花费零时间,这需要超过零的时间! 但是请记住,如果您睡眠的时间为负值,则符合睡眠 7 年零 7 个月。 总是符合比请求的时间更长的睡眠时间。 如果您需要荒谬地小的睡眠时间,则需要进行繁忙循环,因为节省 CPU 的睡眠时间最终会等待中断,而其他代码运行... - Yakk - Adam Nevraumont