C 以负值表示的已用时间

C 以负值表示的已用时间,c,C,我是这样计算总运行时间的,但有时会显示负值。 问题的原因可能是什么 提前感谢。请记住,该结构既有秒字段,也有微秒字段。因此,如果您只是简单地减去微秒字段,您可能会有一个以秒为单位的时间,但微秒字段会更少。例如,当结束时间为5秒时,100微秒将产生负结果,而使用减法时为4秒和5000微秒。为了得到正确的结果,必须同时考虑结构的秒和微秒字段。这可以通过执行以下操作来完成: struct timeval start, end; start.tv_usec = 0; end.tv_usec

我是这样计算总运行时间的,但有时会显示负值。 问题的原因可能是什么


提前感谢。

请记住,该结构既有秒字段,也有微秒字段。因此,如果您只是简单地减去微秒字段,您可能会有一个以秒为单位的时间,但微秒字段会更少。例如,当结束时间为5秒时,100微秒将产生负结果,而使用减法时为4秒和5000微秒。为了得到正确的结果,必须同时考虑结构的秒和微秒字段。这可以通过执行以下操作来完成:

  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);
long seconds=end.tv_sec-start.tv_sec;
长微秒=end.tv\u usec-start.tv\u usec;
如果(微秒<0)
{
秒-=1;
}
长总微秒=(秒*1000000)+abs(微秒);
来自:

数据类型:struct timeval

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

long-int-tv\u-sec

这表示已用时间的整秒数

long int tv\u usec

这是剩余的运行时间(一秒的分数),以微秒数表示。它总是少于一百万


唯一要减去的是
tv\u-usec
中的微秒数,而不是
tv\u-sec
中的整秒数。您需要同时使用这两个值,才能找到两个时间之间的精确微秒差。

可能是以下几点:

long t=(end.tv\u sec*1e6+end.tv\u usec)-(start.tv\u sec*1e6+start.tv\u usec)

可在此处找到相关的讨论(包括解决方案):
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);