我正在玩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。
答案 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。