Linux 测量时间:gettimeofday、TSC和时钟滴答之间的差异
我正在为我的程序做一些性能分析。我尝试用以下四种方法来衡量执行情况。有趣的是,它们显示出不同的结果,我并不完全理解它们的差异。我的CPU是Intel(R)Core(TM)i7-4770。系统是Ubuntu 14.04。提前感谢您的解释 方法1: 使用Linux 测量时间:gettimeofday、TSC和时钟滴答之间的差异,linux,performance,profiling,intel,rdtsc,Linux,Performance,Profiling,Intel,Rdtsc,我正在为我的程序做一些性能分析。我尝试用以下四种方法来衡量执行情况。有趣的是,它们显示出不同的结果,我并不完全理解它们的差异。我的CPU是Intel(R)Core(TM)i7-4770。系统是Ubuntu 14.04。提前感谢您的解释 方法1: 使用gettimeofday()函数,结果以秒为单位 方法2: 使用与以下类似的rdtsc指令 方法3和4利用Intel(PCM)API 方法3: 使用PCM的 uint64 getCycles(const CounterStateType&before
gettimeofday()
函数,结果以秒为单位
方法2:
使用与以下类似的rdtsc
指令
方法3和4利用Intel(PCM)API
方法3:
使用PCM的
uint64 getCycles(const CounterStateType&before,const CounterStateType&before)
它的描述(我不太明白):
方法4:
使用PCM的
uint64 getInvariantsc(const CounterStateType&before,const CounterStateType&before)
其说明:
Computes number of invariant time stamp counter ticks.
This counter counts irrespectively of C-, P- or T-states
两次样本运行产生如下结果:
(方法1以秒为单位。方法2~4除以一个(相同)数字表示每项成本)
一些意见:
gettimeofday()
足够精确,那么rdtsc
方法将显示“不变量”属性。(是的,我从互联网上读到,当前一代的英特尔CPU在rdtsc
上有此功能)gettimeofday()
不是为测量时间间隔而设计的。不要把它用于那个目的
如果需要墙时间间隔,请使用POSIX单调时钟。如果需要特定进程或线程花费的CPU时间,请使用POSIX进程时间或线程时钟。请参见人工时钟\u gettime
当您确切知道自己在做什么时,PCM API非常适合用于微调性能度量。这通常是获得各种独立的内存,核心,高速缓存,低功耗。。。业绩数字。如果您不确定您需要什么样的确切服务,而无法从
clock\u gettime
中获得,请不要开始搞乱它。这是用于Linux的吗?如果是,请贴上标签。或者.Net或者安卓或者…@RenniePet哦,我忘记了最重要的信息。这是针对Linux的。谢谢你的提醒。你的实际问题是什么?如果我确实想得到墙的时间间隔,但在周期/滴答声方面,有没有办法得到它?我在看PCM,因为我想分析一些L2CacheMiss,L2cachehittratio。。。东西但我刚开始计时功能时就卡住了。我不确定“滴答”有什么可靠的含义。您的CPU时钟频率可能是可变的,内核可能是无滴答的,等等。是的,如果您想要缓存评测之类的,那么PCM就是一种选择。
Computes number of invariant time stamp counter ticks.
This counter counts irrespectively of C-, P- or T-states
0.016489 0.533603 0.588103 4.15136
0.020374 0.659265 0.730308 5.15672