在Win32应用编程接口中,有一个函数QueryPerformanceCounter,用于查询一个非常高精度的性能计时器的值。
什么是“高精度性能定时器”?它受硬件支持吗?哪些系统不支持它?
发布于 2011-12-07 19:45:27
在当前一代处理器上的Windows 7下,这是一个可靠的高精度(纳秒) CPU内部计时器(HPET)。
在以前的版本和前几代处理器上,它是“某种东西”,可以表示几乎任何东西。最常见的是RDTSC指令(或非x86上的等效指令)返回的值,它可能是可靠的,也可能不是可靠的和独立于时钟的。请注意,RDTSC (最初,根据定义,但现在不再)不测量时间,它测量周期。
在当前和上一代cpu上,RDTSC通常是可靠和独立于时钟的(即,它现在真正测量时间),在上一代cpu上,特别是在移动或一些多cpu平台上,RDTSC并非如此。“计时器”可能会加速和减速,甚至在不同的CPU上会有所不同,从而导致“时间旅行”。
RDTSC: cpuid(0x80000007)中的constant tsc
标志可以用来判断是否可靠(尽管这并不能真正解决问题,因为如果它不可靠,如果没有替代方案,该怎么办...)。
在更老的系统上(例如,8-10岁),其他一些计时器可能用于QueryPerformanceCounter。这些可能根本没有高分辨率,也不是非常准确。
发布于 2011-12-07 19:44:58
高分辨率性能计数器通常从rdtsc
指令中提取,这是一种特定于x86的方法,用于获取自启动以来发生的CPU tick数。它的值非常精确,通常降到100 is的精度。
与此相比,GetTickCount()
的精度约为16ms。
在其他架构上(不在Win32 API的范围内,因为它们只在基于x86的指令集上运行),可能会有不同的方法来实现这一点。例如,在ARM上,您可以使用系统控制协处理器(CP15)来执行类似的操作。
https://stackoverflow.com/questions/8414734
复制相似问题