我正在尝试测量一个函数需要多长时间。
我有一个小问题:虽然我想要精确,并使用浮点,每次我使用%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
答案 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差异中。