【发布时间】:2011-12-07 11:42:49
【问题描述】:
在 Win32 API 中有一个函数 QueryPerformanceCounter 可以查询一个非常高分辨率的性能计时器的值。
什么是“高分辨率性能计时器”?硬件支持吗?哪些系统不支持?
【问题讨论】:
在 Win32 API 中有一个函数 QueryPerformanceCounter 可以查询一个非常高分辨率的性能计时器的值。
什么是“高分辨率性能计时器”?硬件支持吗?哪些系统不支持?
【问题讨论】:
在当前一代处理器上的 Windows 7 下,这是 CPU (HPET) 内可靠的高精度(纳秒)计时器。
在以前的版本和前几代处理器上,它是“某物”,几乎可以表示任何东西。最常见的是,它是 RDTSC 指令(或非 x86 上的等效指令)返回的值,它可能可靠且与时钟无关。请注意,RDTSC(最初,根据定义,但现在不再)不测量时间,它测量周期。
在当前和上一代 CPU 上,RDTSC 通常是可靠且独立于时钟的(即它现在真正测量时间),在 pre-上一代,尤其是在移动设备或某些多 CPU 设备上,它不是。 “计时器”可能会加速和减速,甚至在不同的 CPU 上会有所不同,从而导致“时间旅行”。
编辑: cpuid(0x80000007) 中的constant tsc 标志可用于判断RDTSC 是否可靠(尽管这并不能真正解决问题,因为如果不可靠怎么办't,如果没有其他选择......)。
在更旧的系统上(例如 8 到 10 年),其他一些计时器可用于 QueryPerformanceCounter。那些可能根本没有高分辨率,也不是非常准确。
【讨论】:
freq * ticks。
timeGetTime 就可以从用户进程中获得。如果您正在编写驱动程序,您可以致电KeQueryInterruptTime。如果您需要更高的分辨率,good 替代品很少。如果您的程序运行的系统具有恒定的 tsc 或 HPET,那么一切都很好。否则你就没有运气。 QPC可能可靠工作,也可能不可靠。
高分辨率性能计数器通常从 rdtsc 指令中提取,这是一种特定于 x86 的方法,用于获取自引导以来发生的 CPU 滴答数。它的值非常精确,通常精确到 100ns。
将此与 GetTickCount() 进行比较,其精度约为 16 毫秒。
在其他架构上(不在 Win32 API 范围内,因为它们仅在基于 x86 的指令集上运行)可能有不同的方法来执行此操作。例如,在 ARM 上,您可以使用系统控制协处理器 (CP15) 来执行类似的操作。
【讨论】: