获取x86当前时间的说明

时间:2015-08-05 10:46:21

标签: performance time x86 instructions

是否有x86指令来获取当前时间?

基本上......类似于clock_get_time的替代品...具有最小开销的东西...我并不真正关心以任何特定格式获得时间...只要它&#39 ;我可以使用的格式。

基本上,我正在做一些工作,以及检测物理真实生活时间和#34;已经过去......我希望能够尽可能频繁地测量时间!

我想你可以想象我正在做类似于分析应用程序的事情......)

我真的需要积极有效地访问硬件时间。理想情况下......一些ASM可以节省时间......将它存储在某个地方......然后将其按照我可以实际处理的某种格式进行按摩。

我对_rdtsc不感兴趣,因为它衡量的是经过的周期数。我需要知道已经执行了多少物理时间......不是由于热波动等原因而变化的周期......

1 个答案:

答案 0 :(得分:2)

对于分析,通常在CPU时钟周期而不是挂钟时间方面最有用。 CPU动态时钟(涡轮增压和省电)使得在测量周期开始之前使CPU上升到全速非常烦人。

如果您在此之后仍需要挂钟时间:

最近的x86 CPU具有以固定速率运行的TSC,无论CPU频率调整是否省电。此外,当CPU停止时,TSC不会停止。 (即没有工作要做,所以它运行HLT指令等待低功耗模式下的中断。)

事实证明,有效访问有用的时间源对于硬件而言比实际的时钟周期计数器更有用,因此RDTSC转变为几代CPU后的几代CPU。介绍。现在我们回到使用硬件性能计数器来测量时钟周期。

在Linux中,在constant_tsc中的CPU功能标记中查找nonstop_tsc/proc/cpuinfo。 IDK,如果有CPUID位。如果不是,请使用Linux的代码(如果您可以使用GPL代码)。

在具有这两个关键功能的CPU上,Linux使用TSC作为其时钟源IIRC。

在用户空间中获取当前时间的最低开销方式是计算RDTSC刻度和实时之间的转换。在进行性能分析时,您可能只存储64位TSC快照,并在以后转换为实时。 (所以你可以处理TSC环绕)。 RDTSC只需要大约24个周期(Agner Fog的指令表,Intel Haswell)。我认为系统调用的开销将高出一个数量级。 (无论如何,内核必须在那里做RDTSC。)

Agner Fog有documented his profiling / timing methods,并有一些示例代码。我最近没看过,但它可能对这个应用程序有用。