HPET的频率与CPU频率用于测量时间

时间:2012-10-19 09:18:41

标签: c++ windows time processor hpet

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

测量时间CPU或HPET的频率至关重要,为什么?

1 个答案:

答案 0 :(得分: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上精确计时的更多详细信息,请参阅this出版物。

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