如何获得当前Windows系统范围的计时器分辨率

时间:2014-01-16 08:40:38

标签: c++ windows api

我知道默认值是每个滴答15.6毫秒,但是一些失败者可能会改变它然后一次又一次地来回转换,我需要轮询当前值以执行有效的QueryPerformanceCounter同步。

那么有一种获取定时器分辨率的API方法吗?

我正在使用C ++ BTW。

4 个答案:

答案 0 :(得分:10)

Windows计时器解析由隐藏的API调用提供:

NTSTATUS NtQueryTimerResolution(OUT PULONG MinimumResolution, 
                                OUT PULONG MaximumResolution, 
                                OUT PULONG ActualResolution);

NtQueryTimerResolution由本机Windows NT库NTDLL.DLL导出。

ActualResolution 的常见硬件平台报告156,250或100,144;较旧的平台可能会报告更多的数字;更新的系统,特别是当支持HPET(高精度事件计时器)或恒定/不变TSC时,可以为ActualResolution返回156,001。

timeBeginPeriod(n)的来电会反映在 ActualResolution 中。

this回答中的更多细节。

答案 1 :(得分:4)

这没有用,另一个过程可以在进行校准时更改

这属于“如果你不能打败他们,加入他们”的类别。在开始校准之前,请致电timeBeginPeriod(1)。这可确保您拥有无人可以更改的已知费率。获得改进的计时器准确性肯定也没有伤害。

请注意,您不可能比QueryPerformanceFrequency()做得更好。除非您长时间校准非常,否则时钟速率不够高,无法提供额外的精度,因为您的测量结果不会超过+/- 0.5毫秒。并且定时器事件不以毫秒精度传送,可以任意延迟。如果你长时间校准,那么GetTickCount64()就足够了。

答案 2 :(得分:1)

RDTSC指令可用于读取CPU时间戳计数器。 在大多数情况下(如果不是全部),此计数器将以CPU时钟频率更改。 如果你想挑剔,你也可以使用像CPUID这样的指令来序列化指令。 有关更多详细信息,请参阅英特尔手册。

您可以针对API进行RDTSC,如QueryPerformanceCounter等。 换句话说,在调用之前和之后使用RDTSC进行测量。

答案 3 :(得分:0)

WINAPI函数GetSystemTimeAdjustment