C中准确的运行时计算

时间:2012-05-14 11:35:22

标签: c linux runtime

我正在尝试计算linux C中算法的运行时间。我正在使用clock_t结构来计算运行时,如下所示:

clock_t t,start,

start=clock();

//code

t=clock()-start;
printf("Time Taken=%f msec\n",(((double)t/CLOCKS_PER_SEC)*1000.00);

问题是我没有按预期获得运行时(它远远低于预期)。而且,运行时始终是10的倍数,这非常不正常。它也会因很大的因素而变化。 C中有没有准确的方法来计算运行时间?

3 个答案:

答案 0 :(得分:1)

在Linux中,最准确的计时器通常是

  • 使用CLOCK_MONOTONIC的clock_gettime,如果你有足够新的内核,它可以测量具有纳秒分辨率的挂钟。

  • getrusage,测量进程所花费的CPU周期,IIRC以由内核滴答频率(jiffies)确定的频率,因此通常为1-10 ms分辨率。这实际上也是你用clock()得到的,除了getrusage让你把时间分解成用户+ sys组件,你可以指定是否要包含子时间等。

  • 正如jpalecek所提到的那样,使用CLOCK_PROCESS_CPUTIME_ID的clock_gettime可以为您提供高分辨率的处理时间(虽然我自己从未使用过它)。

答案 1 :(得分:1)

clock()是非常不精确的,你所描述的说它每10毫秒“滴答”一次。您可以尝试使用clock_gettime with the accompanying function clock_getres with the CLOCK_PROCESS_CPUTIME_ID timer

此外,您可能希望使用gettimeofday()计算挂钟时间(包括等待时间,而不是cpu-clock时间)。这也更精确。

答案 2 :(得分:0)

使用此函数.Thsi将以微秒为单位计算时间差。

int timeval_subtract ( struct timeval *result,  struct timeval *x,  struct timeval *y)
{
  /* Perform the carry for the later subtraction by updating y. */
  if (x->tv_usec < y->tv_usec) {
    int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
    y->tv_usec -= 1000000 * nsec;
    y->tv_sec += nsec;
  }
  if (x->tv_usec - y->tv_usec > 1000000) {
    int nsec = (x->tv_usec - y->tv_usec) / 1000000;
    y->tv_usec += 1000000 * nsec;
    y->tv_sec -= nsec;
  }

  /* Compute the time remaining to wait.
     tv_usec is certainly positive. */
  result->tv_sec = x->tv_sec - y->tv_sec;
  result->tv_usec = x->tv_usec - y->tv_usec;

  /* Return 1 if result is negative. */
  return x->tv_sec < y->tv_sec;
}

如何使用它:

struct timeval starttime,endtime,timediff;
gettimeofday(&starttime,0x0);
//your code 
..
..
//your code ends
gettimeofday(&endtime,0x0);
timeval_subtract(&timediff,&endtime,&starttime);

timediff.tv_sec将秒。 timediff.tv_usec将是微秒。

因此总时差为timediff.tv_sec.timediff.tv_usec