以毫微秒为单位的执行时间和相关问题

问题描述:

我正在使用以下代码来计算以毫秒为单位的执行时间。以毫微秒为单位的执行时间和相关问题

struct timespec tp; 
if (clock_gettime (CLOCK_REALTIME, &tp) == 0) 
    return ((tp.tv_sec * 1000000000) + tp.tv_nsec); 
else 
    return ; 

您能否告诉我这是否正确? 让我们命名这个函数comptime_nano()。

现在,我在main()中编写以下代码来检查以下操作的执行时间。

unsigned long int a, b, s1, s3; 
a = (unsigned long int)(1) << 63; 
b = (unsigned long int)(1) << 63; 
btime = comptime_nano(); 
s1 = b >> 30; 
atime = comptime_nano(); 
printf ("Time =%ld for %lu\n", (atime - btime), s1); 
btime = comptime_nano(); 
s3 = a >> 1; 
atime = comptime_nano(); 
printf ("Time =%ld for %lu\n", (atime - btime), s3); 

令我惊讶的是,第一操作大约需要大约4倍的时间比第二。再一次,如果我改变这些操作的相对顺序,各自的时序变化很大。

请评论...

+3

什么,你想测量执行* single * shift所需的时间? – 2010-05-27 11:34:46

+0

+1过于苛刻以至于没有投票,我们都是初学者。 – 2010-05-27 11:40:49

clock_gettime不是那种计量不够准确。如果您需要测量那样的操作,那么在比较之前,循环操作数千次(或数百万次)。上面的两个操作应该花费相同的时间量,但示例代码中的第二个操作不具有将a,b,s1s3加载到处理器的缓存中的开销。

此外,这里发生了什么?

struct timespec tp; 
if (clock_gettime (CLOCK_REALTIME, &tp) == 0) 
    return ((tp.tv_sec * 1000000000) + tp.tv_nsec); 
else 
    return ; 

第一回是非法的,如果该函数返回void,第二是非法的,如果它不返回void ....

编辑:1000000000也溢出的int范围。

+0

你确定这个决议? Linux文档说这个解决方案是依赖于系统的。我可以很容易地看到一个在Intel平台上使用RDTSC的系统,以获得CPU时钟的恢复(应该足够了)。此外,大整数不应该成为问题,因为时间值倾向于以64位整数工作。光秃秃的回报*虽然是一个问题。 – 2010-05-27 12:22:37

+0

@ T.E.D .: 1000000000是一个有符号整数。 1000000000不符合带符号的整数。如果你想要64位文字,你需要做1000000000或1000000000。即使计时器会给你CPU时钟的时间,但它仍然不够准确。 CPU时钟不显示两段代码的相对性能;更多的时候,他们在这样的代码中只显示缓存行为。 – 2010-05-27 13:08:23

如果您的分辨率不够好,而且您正在Intel PC上运行,请尝试使用实时时间戳计数器(RDTSC)。我发现这个代码在Umbutu上使用它:

#include<sys/time.h> 
#include<time.h> 
typedef unsigned long long ticks; 

static __inline__ ticks getticks(void) 
{ 
    unsigned a, d; 
    asm("cpuid"); 
    asm volatile("rdtsc" : "=a" (a), "=d" (d)); 

    return (((ticks)a) | (((ticks)d) << 32)); 
}