std :: chrono似乎没有提供准确的时钟分辨率/频率

时间:2017-10-04 14:36:11

标签: c++ windows c++11 frequency clock

我一直在读这个,而且这些数字并没有加起来。在我的操作系统(Windows)上,我可以像这样检查系统时钟的分辨率:

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 :: chrono检查相同的细节。根据cppreference.com和本网站上流行的答案,std :: chrono时钟的周期是一个编译时间比率,由分子和分母组成,它指定了刻度之间有多少秒。

cppreference.com:

  期间:a   std :: ratio表示滴答期(即每秒的秒数)   蜱)

从堆栈溢出回答:

  

最小可表示的持续时间是   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?

根据解释的内容,我的系统时钟能够达到1纳秒的分辨率?操作系统似乎并不这么认为。我还尝试了一些支持我的系统时钟频率大约为3903987的其他工具,所以我看不出它如何管理比这更精细的分辨率。

我不确定频率是否随CPU功率设置/升压模式而变化,尽管high_resolution_clock :: is_steady结果为true。我重新启动计算机两次并得到频率计数器3903994和3903991,所以每次启动这个数字似乎都会改变。我想在编译时计算时钟并不理想,而不是开始运行程序。

那么有没有办法用std :: chrono获得系统时钟的实际分辨率/频率?

1 个答案:

答案 0 :(得分:0)

period::numperiod::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是一个很好的答案,可以做很多这样的事情。

chrono提供的主要是一个库,可以使不同的时钟系统轻松和类型安全。它有持续时间和时间点,每个持续时间和时间点都带有它们的单位,因此不小心增加了几秒 - 纳秒不会发生。