31

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

我有一个小问题:虽然我试图做到精确并使用浮点数,但每次我使用打印代码时,%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

谁能让我知道什么是不正确的,或者为什么我只得到int值?

4

4 回答 4

27

一个整数除以一个整数得到一个整数。尝试这个:

#define BILLION 1E9

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

于 2010-10-15T23:28:05.250 回答
9

( requestEnd.tv_nsec - requestStart.tv_nsec )是整数类型,并且总是小于BILLION,所以整数运算中一个除以另一个的结果总是0. double在进行除法之前,您需要将减法的结果转换为 eg 。

于 2010-10-15T23:29:00.053 回答
1

我知道这个问题是很久以前发布的,但我仍然看不到建议您将经过的时间“转换”为纳秒(或毫秒)而不是代码示例中的秒的答案。

示例代码片段来说明这个想法:

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

这样您就可以避免浮点运算,这对于某些平台来说可能很重......

于 2017-08-05T14:12:33.403 回答
1

请注意,(requestEnd.tv_nsec - requestStart.tv_nsec) 可以为负数,在这种情况下,您需要从 tv_sec 差异中减去 1 秒,然后在 tv_nsec 差异中添加 10 亿。

于 2016-12-02T14:11:44.283 回答