1

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

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

4

1 回答 1

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 校准这些频率时,才能执行真正准确的计时。有关Windows 上准确计时的更多详细信息,请参阅此出版物。

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

于 2012-10-19T09:54:07.127 回答