Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 测量时间:gettimeofday、TSC和时钟滴答之间的差异_Linux_Performance_Profiling_Intel_Rdtsc - Fatal编程技术网

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

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

我正在为我的程序做一些性能分析。我尝试用以下四种方法来衡量执行情况。有趣的是,它们显示出不同的结果,我并不完全理解它们的差异。我的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,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除以一个(相同)数字表示每项成本)

一些意见:

  • 方法1与方法2的比率非常一致,而其他方法则不一致。i、 e.,0.016489/0.533603=0.020374/0.659265。假设
    gettimeofday()
    足够精确,那么
    rdtsc
    方法将显示“不变量”属性。(是的,我从互联网上读到,当前一代的英特尔CPU在
    rdtsc
    上有此功能)

  • 方法3的报告高于方法2。我想它与TSC有些不同。但这是什么呢

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

  • 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