我使用以下代码计算以毫秒为单位的执行时间。
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倍。同样,如果我改变这些操作的相对顺序,相应的时间会发生巨大变化。
请评论......
答案 0 :(得分:3)
clock_gettime
对于那种测量来说不够准确。如果您需要测量这样的操作,请在比较之前在循环中执行数千(或数百万次)操作。上面的两个操作应该花费相同的时间,但示例代码中的第二个操作没有将a
,b
,s1
和s3
加载到处理器的缓存。
此外,这里发生了什么?
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));
}