使用HPET时QueryPerformanceFrequency是否准确

Is QueryPerformanceFrequency accurate when using HPET?

本文关键字:是否 QueryPerformanceFrequency HPET 使用      更新时间:2023-10-16

我在玩QueryPerformanceFrequency。它曾经返回3.6 Mhz,但这还不足以满足我的要求

我已使用此命令bcdedit /set useplatformclock true启用了HPET。现在它返回14.3 Mhz。它很棒,更精确。。。当然不是。我很快意识到我没有得到我期望的粒度。

如果我尝试轮询QueryPerformanceCounter直到它滴答作响,我能得到的最小增量是11,也就是1.27Mhz。如果我试着计算一秒钟内可以从QueryPerformanceCounter得到的不同值的数量,我得到的是1.26Mhz

所以我想知道有没有办法真正充分利用14.3 Mhz

我使用的是windows7,64位系统,visualstudio2008。

众所周知,使用HPET硬件作为QueryPerformanceCounter(QPC)的来源会带来巨大的开销。

QPC在配置HPET时是一个昂贵的调用

它提供14.3 MHz,这表明它的精度很高,但正如你所发现的,它的调用速度还不够快,无法真正解析该频率。

因此,只要硬件有能力,微软就把CPU时间戳计数器(TSC)作为QPC的来源。TSC查询的开销要低得多。用于QPC的相关频率通常是CPU频率除以1024;通常也是几个MHz。

TSC模式下QPC的呼叫速度如此之快,以至于许多连续呼叫可能会显示相同的结果(通常约20-30次呼叫或15-20ns/次呼叫)。通过这种方式,您可以获得大约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进行过采样。

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

有关详细信息,请参阅获取高分辨率时间戳(MSDN 2014)。

这是一篇综合性的文章,有很多例子和详细的描述。QPC用户的必读。

。。。一种真正充分利用14.3兆赫的方法

很遗憾没有

您可以从Windows系统内部运行Coreinfo.exe实用程序。系统内部已经转移到微软技术网。这是链接:Sysinternals系统信息实用程序。这将为您提供问题的答案:如何检查我的系统是否具有非不变TSC

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

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