我正在为我的部分程序进行一些性能分析。我尝试用以下四种方法测量执行情况。有趣的是,他们显示出不同的结果,我不完全理解他们的差异。我的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与方法2的比率非常一致,而其他方法则不一致。即,0.016489 / 0.533603 = 0.020374 / 0.659265。假设gettimeofday()
足够准确,rdtsc
方法表现出“不变”属性。 (是的,我从互联网上读到,当前一代英特尔CPU具有rdtsc
的此功能。)
方法3报告高于方法2.我猜它与TSC有些不同。但它是什么?
方法4是最令人困惑的方法。它报告的数量比方法2和3大一个数量级。它不应该是一种循环计数吗?更不用说它带有“不变”的名字。
答案 0 :(得分:1)
gettimeofday()
不适用于测量时间间隔。不要为此目的使用它。
如果需要间隔时间间隔,请使用POSIX单调时钟。如果您需要特定进程或线程花费的CPU时间,请使用POSIX进程时间或线程时间时钟。请参阅man clock_gettime
。
当您确切知道自己在做什么时,PCM API非常适合进行精细调整的性能测量。这通常是获得各种独立的内存,核心,缓存,低功耗......性能数据。如果您不确定从clock_gettime
获得的确切服务是什么,请不要开始搞乱它。