我正在为我的部分程序做一些性能分析。我尝试用以下四种方法来衡量执行情况。有趣的是,它们显示出不同的结果,我并不完全理解它们的差异。我的 CPU 是 Intel(R) Core(TM) i7-4770。系统是 Ubuntu 14.04。提前感谢您的任何解释。
方法一:使用gettimeofday()
函数,结果以秒为单位
方法二:使用rdtsc
类似https://stackoverflow.com/a/14019158/3721062的指令
方法 3 和 4 利用 Intel 的性能计数器监视器 (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 大一个数量级。它不应该也是一种循环计数吗?更不用说它带有“不变”的名称了。