0

Linux Cでアルゴリズムのランタイムを計算しようとしています。clock_t次のように、structを使用してランタイムを計算しています。

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_gettime with CLOCK_MONOTONIC、これは、十分に新しいカーネルがある場合、ナノ秒の解像度でウォールクロックを測定します。

  • getrusageは、プロセス、IIRCによって費やされたCPUサイクルを、カーネルティック周波数(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

この関数を使用します。この関数は、時間差をマイクロ秒単位で計算します。

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 に答える