使用HPET时QueryPerformanceFrequency是否准确?

时间:2014-04-08 15:55:04

标签: c++ windows visual-c++ performancecounter

我正在玩QueryPerformanceFrequency。 它过去常常返回3.6 Mhz,但这还不足以让我尝试做什么。

我已使用此命令HPET启用bcdedit /set useplatformclock true。现在它返回14.3 Mhz。它更精确,更精确......除非它没有。我很快意识到我没有达到预期的粒度。

如果我尝试轮询QueryPerformanceCounter直到它结束,我可以获得的最小增量是11,这意味着1.27Mhz。如果我尝试计算一秒钟内可以从QueryPerformanceCounter获得的不同值的数量,我会得到1.26Mhz

所以我想知道有没有办法真正完全使用14.3 Mhz

我正在使用Windows 7,64位系统,visual studio 2008。

1 个答案:

答案 0 :(得分:7)

使用HPET硬件作为QueryPerformanceCounter(QPC)的源代码会产生大量开销。

配置HPET时,QPC是一项昂贵的电话。

它提供了14.3 MHz的频率,这表明它具有很高的准确度,但正如您所发现的那样,它无法足够快地调用以实际解析该频率。

因此,只要硬件能够这样做,Microsoft就会将CPU时间戳计数器(TSC)作为QPC的源。 TSC查询的开销要低得多。用于QPC的相关频率通常是CPU频率除以1024;通常也只有几MHz。

QC在TSC模式下的呼叫速度非常快,以至于很多连续呼叫可能会显示相同的结果(通常约为20-30次呼叫或15-20次呼叫)。 这样您可以获得大约的典型分辨率。 0.3 us(在3.4 GHz CPU上)。

在切换到HPET之前,您观察到了3.6 MHz。这可能是系统ACPI PM计时器(3579545 Hz)的签名,这表明您在切换到HPET之前没有在基于TSC的QPC上运行。

无论哪种方式,运行HPET或ACPI PM定时器都会在几MHz的范围内产生可用的分辨率。两者都不能暴露性能计数器频率(PCF)给出的全分辨率,因为对QPC的调用过于昂贵。只有基于TSC的QPC足够快,并且能够实际对QPC进行过采样。

微软最近刚发布了有关此事的更多详细信息:

有关详细信息,请参阅Acquiring high-resolution time stamps(MSDN 2014)。

这是一篇包含大量示例和详细说明的综合性文章。必须为QPC用户阅读。

......一种真正使用14.3 Mhz的方法吗?

不幸的是没有。

您可以从Windows Sysinternals运行Coreinfo.exe实用程序。 Sysinternals已转移到Microsoft technet。这是链接:Sysinternals System Information Utilities。这将为您提供一个问题的答案:如何检查我的系统是否具有非不变的TSC?

摘要: QPC基于TSC获得最佳分辨率/准确度/粒度。

BTW:正确选择硬件作为QPC的资源也会影响新GetSystemTimePreciseAsFileTime function(Windows 8桌面及以上版本)的通话费用,因为它内部使用QPC。