经过时间为负值

时间:2011-10-17 20:01:04

标签: c

  struct timeval start, end;
  start.tv_usec = 0;
  end.tv_usec = 0;

  gettimeofday(&start, NULL);

  functionA();

  gettimeofday(&end, NULL);

  long t = end.tv_usec - start.tv_usec;
  printf("Total elapsed time %ld us \n", t);

我正在计算这样的总经过时间,但它有时显示负值。 可能是什么原因造成的?

提前致谢。

3 个答案:

答案 0 :(得分:4)

请记住,该结构有秒和微秒字段。因此,如果您只是减去微秒字段,则可能会有一个稍后的秒数,但微秒字段会更少。例如,结束时间为5秒,与使用减法方法的4秒和5000微秒相比,100微秒将产生负结果。为了获得正确的结果,您必须考虑结构的秒和微秒字段。这可以通过以下方式完成:

long seconds = end.tv_sec - start.tv_sec;
long micro_seconds = end.tv_usec - start.tv_usec;

if (micro_seconds < 0)
{
    seconds -= 1;
}

long total_micro_seconds = (seconds * 1000000) + abs(micro_seconds);

答案 1 :(得分:2)

可能有以下几点:

long t = (end.tv_sec*1e6 + end.tv_usec) - (start.tv_sec*1e6 + start.tv_usec);

答案 2 :(得分:0)

来自The GNU C Library

  

数据类型: struct timeval

     

struct timeval结构代表经过的时间。它在sys/time.h中声明,并具有以下成员:

     
    

long int tv_sec

         
      

这表示经过时间的整秒数。

    
         

long int tv_usec

         
      

这是剩余的经过时间(几分之一秒),表示为微秒数。它总是不到一百万。

    
  

您唯一减去的是tv_usec中的微秒,超过tv_sec中的完整秒值。您需要使用这两个值才能找到两次之间的精确微秒差异。