我需要以纳秒为单位测量函数执行时间。现在我想知道我的电脑是否可以做到这一点以及测量精度是多少。有人建议使用 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/