std :: chrono似乎没有给出准确的时钟分辨率/频率
我一直在阅读关于这一点,并且数字没有加起来。在我的操作系统(Windows),我可以检查系统时钟的分辨率是这样的:std :: chrono似乎没有给出准确的时钟分辨率/频率
LARGE_INTEGER largeInt; // Basically a struct/union containing a long long
QueryPerformanceFrequency(&largeInt);
// largeInt now holds the frequency of my system's clock, it's 3903987
// This ends up being a resolution of about 256 nanoseconds
所有这些都是好的,但现在我想使用std ::时辰检查相同的细节。根据cppreference.com和本网站的一个流行答案,std :: chrono时钟的周期是一个编译时间比率,由分子和分母组成,它指定了tick之间的秒数。
cppreference.com:
周期:表示蜱周期(每 蜱iethe秒数)
而且从堆栈溢出回答一个 的std ::比
最小可表示持续时间为 high_resolution_clock :: period :: num/ high_resolution_clock :: period :: den秒。你可以像这样 打印:
std::cout <<
(double)std::chrono::high_resolution_clock::period::num/
std::chrono::high_resolution_clock::period::den;
所以,我想:
// On Windows the result is typedeffed as intmax_t, which is a typedef for a long long
intmax_t numerator = std::chrono::high_resolution_clock::period::num;
intmax_t denominator = std::chrono::high_resolution_clock::period::den;
// numerator is 1 and denominator is one billion, which would suggest a
// tick period of one nanosecond?
根据什么解释了我的系统的时钟能够在一个纳秒的分辨率?操作系统似乎并不这么认为。我也尝试了一些支持我的系统时钟频率在3903987左右的其他工具,所以我不明白它如何管理比这更好的分辨率。
虽然high_resolution_clock :: is_steady结果为true,但我不确定频率是否随CPU功率设置/升压模式变化而变化。我重新启动计算机两次,得到3903994和3903991的频率计数器,所以每次启动这个数字似乎都会改变。我想这在编译时计算时钟并不理想,而不是开始运行程序。
那么有什么方法可以用std :: chrono获得系统时钟的实际分辨率/频率?
period::num
和period::den
只是告诉你哪个单位的HPC中。
在您的系统,它的单位是纳秒。 “tick”不是时钟增加的单位,而是时钟单位的时间是,测量的是英寸。
它不测量“处理器周期”,它测量的是纳秒。它的工作是相对一致地给你当前的时间,以毫微秒为单位。
现在,如果CPU每隔256纳秒运行一个周期,那么两个调用high_resolution_clock::now()
以及另一个调用不会小于相隔(因为它们需要多个周期!)。
C++不公开CPU的时钟时间。这并非全部有用。
如果您想记录两个时间点,请使用clock::now()
作为您的时钟。如果您想要最佳分辨率,std库可以取消,请使用high_performance_clock
。如果具有100%保证的时钟时间从不从不倒退,请使用steady_clock
(在检查其分辨率是否足够后)。
您可以将这些时间点转换为系统时钟,如果您想要日历时间,则可以将时间点转换为time_t。 (时钟之间的转换需要您有一个共同的时间点,根据我的经验;您应该生成一次这个公共时间点并重新使用它)
如果您需要更多的分辨率而不是系统时钟许可,可以将时间点转换为系统时钟,即time_t,返回到系统时钟并返回到您的时钟,减去差值,并以纳秒为单位显示该差异。
Here是一个SO的答案,做了一堆这些东西。
chrono提供的主要功能是使用不同的时钟系统进行工作,使其易于使用和安全。它有持续时间和时间点,每个持有他们的单位与他们,因此意外添加秒 - 几纳秒不会发生。
这似乎是您必须在处理器制造商手册中阅读的内容,而不是通过软件测试才能达到合理的准确度。现代处理器也一直在改变它们的频率,所以它的价值也是如此。 – nwp
@nwp所以没有可靠一致的时钟这样的事情?我知道处理器以不同的速度运行,但就计时系统而言,硬件之间没有标准给出相同的结果? – Zebrafish
时钟是令人惊讶的复杂的野兽。您可以以某种精度获取当前时间,但结果会立即出错。你究竟想实现什么?微基准? – nwp