测量装配时间

时间:2015-10-21 17:31:14

标签: linux assembly

现在几个小时,我试图找到一种方法来测量代码中的时间间隔。到目前为止我所看到的是,我可以查询CPU周期数,但当然,我需要知道CPU频率以将周期数转换为时间。我找到了rdmsr指令,但是它是ring0指令,而ring0不是我可以放入代码的东西。

我发现的一些示例为此调用了Windows Query *函数,但我没有在Windows上运行。我有什么方法可以测量用户级别的时间间隔吗?获取频率的任何其他方式,或者可能是我可以直接访问的其他时钟?一秒钟的分辨率系统时钟当然是不可能的:)

1 个答案:

答案 0 :(得分:-2)

我花了很长时间与周期计数器一起工作,最终得出(或许显而易见的)RDTSC计算周期而不是时间的结论。它永远不会计算时间,因为计算机的时钟正由电源管理单元不断地上升和下降。因此,循环计数器对于测量循环非常精确,可靠地以实时单位的随机量消失。我相信英特尔最终通过将循环计数器锁定到一个不受PMU影响的时钟来解决这个问题,但我还没有调查过它。

Windows Query *函数实际上并不使用RDTSC循环计数器。我认为他们做了,直到我试图测量真正的小周期并发现它有14MHz(?)刻度,结果证明是PCI数据总线时钟。

除此之外,每个核心都有自己的循环计数器。因此,在执行RDTSC操作码时必须注意您使用的是哪个核心。每个核心都有自己的PMU。

您将在Windows用户模式中找到的最佳计时器是QueryPerformanceCounter()和QueryPerformanceFrequency()。