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

我知道每个tick的默认值是15.6毫秒,但有些输家可能会改变它,然后一次又一次地来回改变,我需要查询当前值是什么执行有效的QueryPerformanceCounter同步。

那么有没有API方法来获得计时器的解决scheme?

我在C ++上。

Solutions Collecting From Web of "如何获取当前Windows系统范围的计时器分辨率"

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支持时,实际分辨率可以返回156,001。

调用timeBeginPeriod(n)会反映在ActualResolution中

在这个答案的更多细节。

这不会有帮助,另一个过程可以改变它, 你正在校准。

这个落在“如果你不能打败他们,加入他们”的范畴。 在开始校准之前调用timeBeginPeriod(1) 这确保你有一个已知的速度,没有人可以改变。 获得改进的计时器准确性也不会伤害。

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

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

您可以使用API​​的QueryPerformanceCounter等工作RDTSC。 换句话说,在通话之前和之后使用RDTSC进行测量。

WINAPI函数GetSystemTimeAdjustment