使用HPET时QueryPerformanceFrequency是否准确?

Art*_*hur 4 c++ windows performancecounter visual-c++

我在玩弄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.

Arn*_*rno 7

已知使用HPET硬件作为QueryPerformanceCounter(QPC)的源与大量开销相关联.

配置HPET时,QPC是一个昂贵的呼叫.

它提供14.3 MHz,这表明高精度,但正如您所发现的,它无法足够快地调用以实际解析该频率.

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

在TSC模式下QPC的呼叫速度非常快,以至于许多连续呼叫可能显示相同的结果(通常约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进行过采样.

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

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

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

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

不幸的是.

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

总结: QPC基于TSC获得最佳分辨率/准确度/粒度.

顺便说一下:正确选择硬件作为QPC资源也会影响新GetSystemTimePreciseAsFileTime函数(Windows 8桌面及以上版本)的调用开销,因为它内部使用QPC.