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

std::chrono doesn't seem to be giving accurate clock resolution/frequency

本文关键字:时钟 频率 分辨率 chrono std      更新时间:2023-10-16

我一直在阅读有关此内容的信息,而且数字不会加起来。在我的操作系统(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时钟的周期是一个编译时间比例,由分子和分母组成,它指定tick之间有多少秒钟。

cppreference.com:

期间: std ::比率代表tick期(即每秒 tick)

,从堆栈溢出答案:

最小代表持续时间为 HIGH_RESOLUTION_CLOCK :: ofend :: num/ HIGH_RESOLUTION_CLOCK :: ofend :: den seconds。你可以像打印 这个:

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的工具,因此我看不出它如何管理分辨率。

我不确定频率是否随CPU功率设置/升压模式而变化,尽管HIGH_RESOLUTION_CLOCK :: IS_STEADY结果是正确的。我两次重新启动了计算机,并获得了3903994和3903991的频计数器,因此每次启动此数字似乎都会发生变化。我想这不是在编译时计算时钟的理想选择,而不是运行程序的开始。

因此,是否可以使用std :: chrono?

获得系统时钟的实际分辨率/频率

period::numperiod::den只需告诉你什么单位HPC在。

在您的系统上,其单元是纳秒。" tick"不是时钟增加的单位,而是时钟时间 in。

它不能测量"处理器周期",它可以测量纳秒。它的工作是相对始终如一地给您当前的时间。

现在,如果CPU每256纳秒每256个周期运行,那么对high_resolution_clock::now()进行了两个电话,而另一个呼叫将不会比这相距甚远(因为它们需要一个以上的周期!)。

C 不会暴露您的CPU的时钟时间。这并不是那么有用。

如果要记录两个时间点,请为时钟使用clock::now()。如果您想要最佳的分辨率,STD库可以完成,请使用high_performance_clock。如果有100%的时钟时间可以保证从不向后返回,请使用steady_clock(检查其分辨率足够后)。

您可以将这些时间点转换为系统时钟,如果需要日历时间,则可以从中转到TIME_T。(在时钟之间转换需要您在我的经验中都有一个共同的时间点;您应该一次生成这个常见时间点并重复使用)

如果您需要比系统时钟允许更多的分辨率,则可以将时间点转换为系统时钟,将时间点转换为time_t,将其回到系统时钟,然后回到您的时钟,减去差异,并在nanseconds之类的单元中显示该差异。

这是一个这样的答案,可以做很多这些东西。

Chrono提供的主要是一个库,可以使使用不同时钟系统的操作易于安全。它有持续时间和时间点,每个都随身携带他们的单位,因此不会发生秒的时间 - 纳秒不会发生。