以毫微秒为单位的执行时间和相关问题
我正在使用以下代码来计算以毫秒为单位的执行时间。以毫微秒为单位的执行时间和相关问题
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倍的时间比第二。再一次,如果我改变这些操作的相对顺序,各自的时序变化很大。
请评论...
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
范围。
你确定这个决议? Linux文档说这个解决方案是依赖于系统的。我可以很容易地看到一个在Intel平台上使用RDTSC的系统,以获得CPU时钟的恢复(应该足够了)。此外,大整数不应该成为问题,因为时间值倾向于以64位整数工作。光秃秃的回报*虽然是一个问题。 – 2010-05-27 12:22:37
@ 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));
}
什么,你想测量执行* single * shift所需的时间? – 2010-05-27 11:34:46
+1过于苛刻以至于没有投票,我们都是初学者。 – 2010-05-27 11:40:49