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

我需要以纳秒为单位来测量函数的执行时间。 现在我想了解我的电脑是否可以做到这一点,测量的精度是多less。 有人build议使用QueryPerformanceFrequency()来获得HPET的频率,1 / hpetFrequency是可以测量的primefaces时间。 这是正确的吗? 我的意思是如果我的CPU频率是3.33GH,甚至1GHz,一个时钟的持续时间是一个纳秒。 这不是说我可以测量纳秒吗?

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

Solutions Collecting From Web of "用于测量时间的HPET频率与CPU频率之间的关系"

你不能测量到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选择CPU的Time Stamp Counter 。 在这种情况下,QPF()的结果等于处理器速度除以一个固定的数字(在你的情况下为1024)。 Windows选择在TSC周围建立计时器,并优先使用恒定/不变TSC。 3.33GHz / 1024 = 3.25MHz。