测量函数所用的时间:clock_gettime

测量函数所用的时间:clock_gettime,c,timing,clock,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, &requ

我试图测量一个函数需要多长时间

我有一个小问题:尽管我试图做到精确,并使用浮点,但每次我使用
%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 );
这段代码大部分不是我写的。此示例页面包含说明以下各项使用的代码:


任何人都可以告诉我什么是错误的,或者为什么我只得到
int
值吗?

将一个整数除以一个整数就会得到一个整数。试试这个:

#define BILLION 1E9

不要在行尾使用分号
#define
是一个预处理器指令,而不是一个语句,包括分号导致
BILLION
被定义为
1000000000L,如果您尝试在大多数上下文中使用它,它将中断。你很幸运,因为你在表达式的末尾和括号外使用了它。

(requestEnd.tv\u nsec-requestStart.tv\u nsec)
是整数类型,并且总是小于
十亿
,因此在整数算术中,一个除以另一个的结果总是
0
。在进行除法之前,您需要将减法的结果转换为例如,
double

请注意,(requestEnd.tv\u nsec-requestStart.tv\u nsec)可能是负数,在这种情况下,您需要从tv\u sec差中减去1秒,然后在tv\u nsec差中再加上10亿。

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

示例代码片段说明了这一想法:

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

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

非常感谢您的帮助。谢谢你让我知道分号,这是我忘了的。非常感谢你!为了演出#定义十亿分之一的1E-9并使用乘法。不,不,不:不要给数字命名。使用他们提供的函数:
#定义时钟精度1000000000L/*10亿*/
@pmg:Pedantry切线:我认为只有在变量名中没有明确单位时,才需要使用
时钟精度
这样的名称。在上面的例子中,从名称
tv\u nsec
可以清楚地看出,我们的时间单位是纳秒。因此,
NANOSECONDS\u/u SECOND
可能是合适的,但这与简单的
BILLION
时钟实时
受到系统时间不连续跳跃的影响没有太大区别。考虑使用<代码> CcLogyMalimoNICIRAW < /COD> -它不受时间调整与<代码> ADJTIME()/<代码>和时间跳跃的影响。在类似的计算中,类似的东西可能是必要的,但在这里不是。如果
requestEnd.tv\u nsec-requestStart.tv\u nsec
为负数,
BILLION
为双数
1E9
,则
(requestEnd.tv\u nsec-requestStart.tv\u nsec)/BILLION
将是
-1.0
0.0
之间的双数,并将该数字添加到
(requestEnd.tv\u sec-requestStart.tv\sec)
将做正确的事情,因为后者隐式转换为double。应该是
/BILLION
,而不是
*BILLION
@FractalSpace,通过乘以我们将秒转换为纳秒。对。您的累计单位为纳秒,而运算单位为秒