执行时间以纳秒为单位和相关问题

时间:2010-05-27 11:31:05

标签: c benchmarking

我使用以下代码计算以毫秒为单位的执行时间。

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倍。同样,如果我改变这些操作的相对顺序,相应的时间会发生巨大变化。

请评论......

2 个答案:

答案 0 :(得分:3)

clock_gettime对于那种测量来说不够准确。如果您需要测量这样的操作,请在比较之前在循环中执行数千(或数百万次)操作。上面的两个操作应该花费相同的时间,但示例代码中的第二个操作没有将abs1s3加载到处理器的缓存。

此外,这里发生了什么?

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

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

编辑:1000000000也超出了int的范围。

答案 1 :(得分:0)

如果您的分辨率不够好,并且您在英特尔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));
}