【问题标题】:HPET's frequency vs CPU frequency for measuring time用于测量时间的 HPET 频率与 CPU 频率
【发布时间】:2012-10-09 21:11:09
【问题描述】:

我需要以纳秒为单位测量函数执行时间。现在我想了解我的计算机是否可以做到这一点,以及测量的精度是多少。有人建议使用 QueryPerformanceFrequency() 来获取 HPET 的频率,而 1/hpetFrequency 是可以测量的原子时间。这是正确的吗?我的意思是如果我的 cpu 频率是 3.33 GH,即使是 1GHz,那么一个时钟持续时间也是 1 纳秒。不是说我可以用纳秒来衡量吗?

对于测量时间 CPU 或 HPET 的频率是必不可少的,为什么?

【问题讨论】:

    标签: c++ windows time processor hpet


    【解决方案1】:

    您无法测量到 1 纳秒,也无法测量到 10 纳秒。这是因为每个action of measurement 都需要某种类型的调用。最快的 API 之一是 GetSystemTimeAsFileTime()。一次通话需要 10-15ns。但它的分辨率/粒度相当差(在 ms 制度下)。 QueryPerformanceCounter() 提供 MHz 到 GHz 范围内的频率,具体取决于底层硬件。这个调用没有那么快,但在 1MHz 时,您可以获得 1 微秒的分辨率。在这样的频率下,由 QueryPerformanceFrequency() 给出,连续调用可能会返回相等的值,因为调用比增量速率更快。 另一个来源是 CPU 时间戳计数器 (rdtsc)。但它也有一些缺点:现代硬件实现了自适应 CPU 频率。因此这个频率不能被认为是一个常数。这种方式只能在恒定阶段进行测量。

    事实上,没有一个频率源提供恒定频率。所有这些频率都是由一些具有offset and drift 的硬件生成的。因此,操作系统将返回 QueryPerformanceFrequency 或 CPU 频率的值,并让您相信它是一个常数。但是,您将获得的号码只有close estimates

    只有根据系统 RTC 校准这些频率,才能执行真正准确的计时。请参阅this 发布以获取有关 Windows 上准确计时的更多详细信息。

    编辑: Windows 选择 CPU 的 Time Stamp Counter。在这种情况下, QPF() 的结果等于处理器速度除以一个固定数字(在您的情况下为 1024)。当恒定/不变的 TSC 可用时,Windows 会优先选择围绕 TSC 构建计时。 3.33 GHz/1024=3.25 MHz。

    【讨论】:

    • 对我来说,性能计数器频率约为 3MHz,这意味着精度约为 300ns。我无法测量 1 或 10ns,但我想我可以测量 50 或 100ns。为什么我的电脑只能测量 300ns?
    • 好吧,看起来您的 QueryPerformanceCounter() 结果是 3,579,545 Hz。因此,您的系统使用 ACPI 电源管理计时器 (pmtimer)。阅读我的链接出版物,了解有关如何以高精度测量时间的更多详细信息。
    • @Narek:请。看我的编辑,你的系统没有使用 HPET 计时,它使用时间戳计数器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多