std::chrono 似乎没有提供准确的时钟分辨率/频率
std::chrono doesn't seem to be giving accurate clock resolution/frequency
我一直在阅读有关此内容的信息,而且数字不会加起来。在我的操作系统(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::num
和 period::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提供的主要是一个库,可以使使用不同时钟系统的操作易于安全。它有持续时间和时间点,每个都随身携带他们的单位,因此不会发生秒的时间 - 纳秒不会发生。
- 在C++/Linux中设置单调时钟的一些技巧
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 在指针的帮助下,文本文件中单词的频率
- 从文本文件中读取时钟时间和事件时间并进行处理
- 函数计算用户按下按钮的频率
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 在条件变量中触发错误信号的频率是多少
- 用时钟测量程序的运行时间
- 如何在 c++ 中循环中使用频率变化的声音?
- 查找给定范围内最长连续 1 的频率
- 字母 字母频率
- 如何在C++中为高分辨率时钟声明变量?
- WM_PAINT消息频率:C#(.Net Framework 4.7.2 WinForms)与C++
- 如何在 C++17 中检索 std::filesystem::file_time_type 的时钟类型
- 我的时钟函数在 c++ 函数中不起作用
- 不同机器之间的标准时钟性能差异显著
- 计时库中的时钟和琐碎时钟概念
- 创建一个函数,返回给定单词在C++中的频率
- std::chrono 似乎没有提供准确的时钟分辨率/频率
- 找出CPU时钟频率(每个核心,每个处理器)