我一直在读这个,而且这些数字并没有加起来。在我的操作系统(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获得系统时钟的实际分辨率/频率?
答案 0 :(得分:0)
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是一个很好的答案,可以做很多这样的事情。
chrono提供的主要是一个库,可以使不同的时钟系统轻松和类型安全。它有持续时间和时间点,每个持续时间和时间点都带有它们的单位,因此不小心增加了几秒 - 纳秒不会发生。