我必须计算一个函数完成所用的时间。 这个函数在循环中调用,我想找出总时间。 通常,纳秒或微秒的时间都非常短。
为了找出经过的时间,我使用struct timeval和clock_gettime()使用struct timespec来使用函数gettimeofday()。
问题是按时间返回的时间以秒为单位是正确的,但在微秒内是错误的。 同样,timespec在纳秒内返回的时间是错误的。 从某种意义上来说,它们与在几秒钟内返回的时间不相符是错误的。
对于clock_gettime(),我尝试了CLOCK_PROCESS_CPUTIME_ID和CLOCK_MONOTONIC。 使用clock()也无济于事。
代码段:
struct timeval funcTimestart_timeval, funcTimeEnd_timeval;
struct timespec funcTimeStart_timespec, funcTimeEnd_timespec;
unsigned long elapsed_nanos = 0;
unsigned long elapsed_seconds = 0;
unsigned long diffInNanos = 0;
unsigned long Func_elapsed_nanos = 0;
unsigned long Func_elapsed_seconds = 0;
while(...)
{
gettimeofday(&funcTimestart_timeval, NULL);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &funcTimeStart_timespec);
...
demo_func();
...
gettimeofday(&funcTimeEnd_timeval, NULL);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &funcTimeEnd_timespec);
elapsed_seconds = funcTimeEnd_timeval.tv_sec - funcTimestart_timeval.tv_sec;
Func_elapsed_seconds+= elapsed_seconds;
elapsed_nanos = funcTimeEnd_timespec.tv_nsec - funcTimeStart_timespec.tv_nsec;
Func_elapsed_nanos+ = elapsed_nanos;
}
printf("Total time taken by demo_func() is %lu seconds( %lu nanoseconds )\n", Func_elapsed_seconds, Func_elapsed_nanos );
Printf输出:
Total time taken by demo_func() is 60 seconds( 76806787 nanoseconds )
请注意以秒和纳秒为单位的时间不匹配。
如何解决此问题或任何其他适当的方法来查找已用时间?
答案 0 :(得分:5)
您是否阅读了time(7)和clock_gettime(2)的文档?请阅读两次。
struct timespec
不应该同时表达两次。字段tv_sec
给出第二部分 ts ,字段tv_nsec
给出纳秒部分 tn 来表示时间 t = ts + 10 -9 tn
我建议将其转换为浮点数,例如
printf ("total time %g\n",
(double)Func_elapsed_seconds + 1.0e-9*Func_elapsed_nanos);
使用浮点更简单,通常精度足以满足大多数需求。否则,当您添加或减去struct timespec
时,您需要处理添加/减去的tv_nsec
字段总和/差异为负数或超过1000000000的情况....
答案 1 :(得分:1)
问题是您正在打印/比较错误的值。
76,806,787 nanoseconds
等于~76 milliseconds
,您无法将其与60秒进行比较。
您忽略了funcTimeEnd_timespec.tv_sec
中存储的秒数。
您还应该打印funcTimeEnd_timespec.tv_sec - funcTimeStart_timespec.tv_sec
,并且如 @Basile Starynkevitch 建议的那样,在将其与10e-9
相乘后添加纳秒部分。然后,您可以比较两个函数显示的时间。
答案 2 :(得分:0)
我回复之前的答案作为答案,因为我想粘贴代码段。
问题是找出是否经过的时间 首先,我应该相互减去相应的时间,然后添加
(end.tv_sec - start.tv_sec) + 1.0e-9*(end.tv_nsec - start.tv_nsec)
或 首先添加时间,然后计算差异
(end.tv_sec + 1.0e-9*end.tv_nsec) - (start.tv_sec + 1.0e-9*start.tv_nsec)
在第一种情况下,通常end.tv_nsec的数量少于start.tv_nsec,因此差异变为负数nd这给了我错误的数字。