我知道默认值是每个滴答15.6毫秒,但是一些失败者可能会改变它然后一次又一次地来回转换,我需要轮询当前值以执行有效的QueryPerformanceCounter同步。
那么有一种获取定时器分辨率的API方法吗?
我正在使用C ++ BTW。
答案 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