0

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

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中是否有任何准确的方法来计算运行时间?

4

3 回答 3

1

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

  • 带有 CLOCK_MONOTONIC 的clock_gettime,如果您有足够新的内核,这将测量具有纳秒分辨率的挂钟。

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

  • 正如 jpalecek 所提到的,带有 CLOCK_PROCESS_CPUTIME_ID 的 clock_gettime 应该为您提供高分辨率的处理时间(尽管我自己从未使用过它)。

于 2012-05-14T11:42:50.043 回答
1

clock() 非常不精确,您所描述的是它每 10 毫秒“滴答”一次。您可以尝试使用带有计时器clock_gettime的随附功能clock_getresCLOCK_PROCESS_CPUTIME_ID

此外,您可能想要计算挂钟时间(包括等待等,而不是 CPU 时钟时间)gettimeofday()。这也更精确。

于 2012-05-14T11:45:14.507 回答
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

于 2012-05-14T12:08:50.013 回答