测量函数所花费的时间:clock_gettime

时间:2010-10-15 23:24:15

标签: c timing clock

我正在尝试测量一个函数需要多长时间。

我有一个小问题:虽然我想要精确,并使用浮点,每次我使用%lf打印我的代码时,我得到两个答案之一:1.000 ...或0.000 ....这导致我想知道我的代码是否正确:

#define BILLION  1000000000L;

// Calculate time taken by a request
struct timespec requestStart, requestEnd;
clock_gettime(CLOCK_REALTIME, &requestStart);
function_call();
clock_gettime(CLOCK_REALTIME, &requestEnd);

// Calculate time it took
double accum = ( requestEnd.tv_sec - requestStart.tv_sec )
  + ( requestEnd.tv_nsec - requestStart.tv_nsec )
  / BILLION;
printf( "%lf\n", accum );

这些代码大部分都不是由我制作的。此示例页面包含说明clock_gettime:http://www.users.pjwstk.edu.pl/~jms/qnx/help/watcom/clibref/qnx/clock_gettime.html

的使用的代码

有人可以让我知道什么是不正确的,或者为什么我只得到整数值?

非常感谢,

Jary

4 个答案:

答案 0 :(得分:26)

将整数除以整数会产生整数。试试这个:

#define BILLION 1E9

并且不要在行尾使用分号。 #define是预处理程序指令,而不是语句,并且包含分号导致BILLION定义为1000000000L;,如果您尝试在大多数情况下使用它,它将会中断。你很幸运,因为你在表达的最后和任何括号之外使用它。

答案 1 :(得分:9)

( requestEnd.tv_nsec - requestStart.tv_nsec )是整数类型,并且始终小于BILLION,因此在整数运算中将一个除以另一个的结果将始终为0。您需要将减法的结果转换为例如在做分歧之前double

答案 2 :(得分:1)

我知道这个问题很久以前就已经发布了,但我仍然没有看到答案,它建议你将经过的时间“转换”为纳秒(或毫秒),而不是代码样本中的秒数。

用于说明这个想法的示例代码片段:

long accum = ( requestEnd.tv_nsec - requestStart.tv_nsec )
 + ( requestEnd.tv_sec - requestStart.tv_sec ) * BILLION;

通过这种方式,您可以避免浮点运算,这对某些平台来说可能很重......

答案 3 :(得分:0)

请注意(requestEnd.tv_nsec - requestStart.tv_nsec)可能为负数,在这种情况下,您需要从tv_sec差值中减去1秒,并将一个BILLION加到tv_nsec差异中。