测量函数所用的时间: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,通过乘以我们将秒转换为纳秒。对。您的累计单位为纳秒,而运算单位为秒