测量时间:gettimeofday,TSC和时钟滴答之间的差异

时间:2014-08-21 14:28:34

标签: linux performance profiling intel rdtsc

我正在为我的部分程序进行一些性能分析。我尝试用以下四种方法测量执行情况。有趣的是,他们显示出不同的结果,我不完全理解他们的差异。我的CPU是Intel(R)Core(TM)i7-4770。系统是Ubuntu 14.04。提前感谢任何解释。

方法1: 使用gettimeofday()功能,结果以秒为单位

方法2: 使用与https://stackoverflow.com/a/14019158/3721062

类似的rdtsc指令

方法3和4利用了英特尔的Performance Counter Monitor(PCM)API

方法3: 使用PCM的

uint64 getCycles(const CounterStateType & before, const CounterStateType &after)

它的描述(我不太明白):

Computes the number core clock cycles when signal on a specific core is running (not halted)

Returns number of used cycles (halted cyles are not counted). The counter does not advance in the following conditions:

an ACPI C-state is other than C0 for normal operation
HLT
STPCLK+ pin is asserted
being throttled by TM1
during the frequency switching phase of a performance state transition
The performance counter for this event counts across performance state transitions using different core clock frequencies

方法4: 使用PCM的

uint64 getInvariantTSC (const CounterStateType & before, const CounterStateType & after)

其描述:

Computes number of invariant time stamp counter ticks.

This counter counts irrespectively of C-, P- or T-states

两个样本运行生成结果如下: (方法1以秒为单位。方法2~4除以(相同)数字以显示每项成本)。

0.016489 0.533603 0.588103 4.15136 

0.020374 0.659265 0.730308 5.15672

一些观察结果:

  1. 方法1与方法2的比率非常一致,而其他方法则不一致。即,0.016489 / 0.533603 = 0.020374 / 0.659265。假设gettimeofday()足够准确,rdtsc方法表现出“不变”属性。 (是的,我从互联网上读到,当前一代英特尔CPU具有rdtsc的此功能。)

  2. 方法3报告高于方法2.我猜它与TSC有些不同。但它是什么?

  3. 方法4是最令人困惑的方法。它报告的数量比方法2和3大一个数量级。它不应该是一种循环计数吗?更不用说它带有“不变”的名字。

1 个答案:

答案 0 :(得分:1)

gettimeofday()不适用于测量时间间隔。不要为此目的使用它。

如果需要间隔时间间隔,请使用POSIX单调时钟。如果您需要特定进程或线程花费的CPU时间,请使用POSIX进程时间或线程时间时钟。请参阅man clock_gettime

当您确切知道自己在做什么时,PCM API非常适合进行精细调整的性能测量。这通常是获得各种独立的内存,核心,缓存,低功耗......性能数据。如果您不确定从clock_gettime获得的确切服务是什么,请不要开始搞乱它。