C在C Linux中查找已用时间

时间:2014-09-30 04:33:26

标签: c performance

我必须计算一个函数完成所用的时间。 这个函数在循环中调用,我想找出总时间。 通常,纳秒或微秒的时间都非常短。

为了找出经过的时间,我使用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 )

请注意以秒和纳秒为单位的时间不匹配。

如何解决此问题或任何其他适当的方法来查找已用时间?

3 个答案:

答案 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这给了我错误的数字。