我正在为我的程序的一部分做一些性能分析。我尝试使用以下四种方法来衡量执行。有趣的是,它们显示出不同的结果,我不完全理解它们的差异。我的 CPU 是英特尔® 酷睿(TM( i7-4770。系统是 Ubuntu 14.04。提前感谢您的任何解释。
方法一:使用gettimeofday()
功能,结果以秒为单位
方法2:使用类似于 https://stackoverflow.com/a/14019158/3721062 的rdtsc
指令
方法 3 和 4 利用英特尔的性能计数器监视器 (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 大一个数量级。不应该也是一种周期计数吗?更不用说它带有"不变"的名字了。
gettimeofday()
不是为测量时间间隔而设计的。不要将其用于此目的。
如果您需要墙壁时间间隔,请使用 POSIX 单调时钟。如果需要特定进程或线程花费的 CPU 时间,请使用 POSIX 进程时间或线程时间时钟。请参阅man clock_gettime
。
PCM API 非常适合在您确切知道自己在做什么时进行微调的性能测量。其中一般是获得各种独立的内存,核心,缓存,低功耗,...性能数据。如果您不确定需要哪些确切的服务而无法从clock_gettime
获得,请不要开始弄乱它。