c++ - HPET 的频率 vs CPU 频率用于测量时间

标签 c++ windows time processor hpet

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

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

最佳答案

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

事实上,没有一个频率源提供恒定的频率。所有这些频率都是由一些具有偏移和漂移的硬件产生的。因此,操作系统将返回 QueryPerformanceFrequency 或 CPU 频率的值,并让您相信它是一个常数。但是,您将获得的数字只是近似估计值

只有当这些频率针对系统 RTC 进行校准时,才能执行真正准确的计时。参见 this有关 windows 准确计时的更多详细信息的出版物。

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

关于c++ - HPET 的频率 vs CPU 频率用于测量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971110/

相关文章:

c++ - 在 9 个资源的 0 到 8 索引中,应该使用哪个纹理槽开始我需要第 7 和第 8 个槽的位置

c++ - 在代码中修改预处理器宏是一种好的风格吗?

windows - 我如何设置 linux 以将 FORTRAN 代码编译成 Windows 二进制文件?

Java 时间循环 - 迭代

c++ - 如何正确构造和继承类?

c++ - 使用 C++ WRL 打开 UsbDevice - ERROR_INVALID_HANDLE

python - 在 Windows 上使用 python 3.5 的 xlwings

windows - 删除 Bonobo 中损坏的存储库

Python: "global name ' 时间'未定义”

javascript - 如何获取当前日期和时间,如下格式 3 :31 pm 7 July 2016