【问题标题】:What is high-resolution performance counter?什么是高分辨率性能计数器?
【发布时间】:2011-12-07 11:42:49
【问题描述】:

在 Win32 API 中有一个函数 QueryPerformanceCounter 可以查询一个非常高分辨率的性能计时器的值。

什么是“高分辨率性能计时器”?硬件支持吗?哪些系统不支持?

【问题讨论】:

    标签: winapi hardware


    【解决方案1】:

    在当前一代处理器上的 Windows 7 下,这是 CPU (HPET) 内可靠的高精度(纳秒)计时器。

    在以前的版本和前几代处理器上,它是“某物”,几乎可以表示任何东西。最常见的是,它是 RDTSC 指令(或非 x86 上的等效指令)返回的值,它可能可靠且与时钟无关。请注意,RDTSC(最初,根据定义,但现在不再)不测量时间,它测量周期

    在当前和上一代 CPU 上,RDTSC 通常是可靠且独立于时钟的(即它现在真正测量时间),在 pre-上一代,尤其是在移动设备或某些多 CPU 设备上,它不是。 “计时器”可能会加速和减速,甚至在不同的 CPU 上会有所不同,从而导致“时间旅行”。

    编辑: cpuid(0x80000007) 中的constant tsc 标志可用于判断RDTSC 是否可靠(尽管这并不能真正解决问题,因为如果不可靠怎么办't,如果没有其他选择......)。

    在更旧的系统上(例如 8 到 10 年),其他一些计时器可用于 QueryPerformanceCounter。那些可能根本没有高分辨率,也不是非常准确。

    【讨论】:

    • 回复:“请注意,RDTSC 不测量时间,它测量周期。”,请务必注意,您可以直接以秒为单位计算时间,如 freq * ticks
    • @Polynomial:不,你不能,因为 freq != const。在今天的几乎每个系统(以及过去五年中的大多数系统)上,频率都在动态调整以节省电力。
    • 有趣。有什么选择?
    • 如果 1ms 的分辨率就足够了,timeGetTime 就可以从用户进程中获得。如果您正在编写驱动程序,您可以致电KeQueryInterruptTime。如果您需要更高的分辨率,good 替代品很少。如果您的程序运行的系统具有恒定的 tsc 或 HPET,那么一切都很好。否则你就没有运气。 QPC可能可靠工作,也可能不可靠。
    【解决方案2】:

    高分辨率性能计数器通常从 rdtsc 指令中提取,这是一种特定于 x86 的方法,用于获取自引导以来发生的 CPU 滴答数。它的值非常精确,通常精确到 100ns。

    将此与 GetTickCount() 进行比较,其精度约为 16 毫秒。

    在其他架构上(不在 Win32 API 范围内,因为它们仅在基于 x86 的指令集上运行)可能有不同的方法来执行此操作。例如,在 ARM 上,您可以使用系统控制协处理器 (CP15) 来执行类似的操作。

    【讨论】:

    • @AlexK。 - 是的,这最终取决于 HAL。但是,在 x86 上,我没有理由使用 rdtsc 以外的其他东西,因为它非常精确。如果我没记错的话,它使用的源时钟与运行中断的源时钟相同,而这些中断的计时非常准确。
    • @Polynomial:请参阅我的回答,了解不应使用 RDTSC 的充分理由,除非您保证您的客户不使用可能使用 4 或 5 年的 CPU。 RDTSC 仅在 一些 CPU 上精确和准确,不一定是所有 CPU(而且您无法真正控制程序在哪个 CPU 上运行)。
    • @Polynomial:不,你不能,真的。虽然它是精确,因为它是纳秒级的分辨率,但它不是准确。而且它根本与时间无关,除非它是新一代 CPU。没有精确的精确意味着什么。如果我给你一个 5000 位的数字,其中 4990 位是假的,那么这个数字并不比我一开始只给你 10 位更好(实际上,实际上它更糟糕......)。
    • @Damon - 非常有趣。处理起来似乎真的很痛苦!
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多