4

ここで実行時間を測定するコードをいくつか見つけました http://www.dreamincode.net/forums/index.php?showtopic=24685

ただし、system() の呼び出しでは機能しないようです。これは、実行が現在のプロセスから飛び出すためだと思います。

clock_t begin=clock();

system(something);

clock_t end=clock();
cout<<"Execution time: "<<diffclock(end,begin)<<" s."<<endl;

それで

double diffclock(clock_t clock1,clock_t clock2)
{
    double diffticks=clock1-clock2;
    double diffms=(diffticks)/(CLOCKS_PER_SEC);
    return diffms;
}

ただし、これは常に 0 秒を返します...動作する別の方法はありますか?

また、これは Linux にあります。

編集:また、追加するために、実行時間は時間のオーダーです。したがって、精度は実際には問題ではありません。

ありがとう!

4

3 に答える 3

9

gettimeofday の使用を検討しましたか?

struct timeval tv;
struct timeval start_tv;

gettimeofday(&start_tv, NULL);

system(something);

double elapsed = 0.0;

gettimeofday(&tv, NULL);
elapsed = (tv.tv_sec - start_tv.tv_sec) +
  (tv.tv_usec - start_tv.tv_usec) / 1000000.0;
于 2010-03-28T17:23:26.323 に答える
6

残念ながら、Linux では clock() の分解能は 1 秒しかありません (マイクロ秒単位で時間を返しますが)。

多くの人がベンチマークに gettimeofday() を使用していますが、これはプロセス/スレッドで使用された時間ではなく経過時間を測定するため、理想的ではありません。明らかに、システムが多かれ少なかれアイドル状態で、テストがかなり長い場合は、結果を平均化できます。通常はそれほど問題にはなりませんが、 gettimeofday() によって返される時刻は非単調であるということを知っておく価値があります。たとえば、システムが最初に NTP タイム サーバーに接続するときなどに、少し前後する可能性があります。

ベンチマークに使用する最善の方法は、タスクに最も適したオプションを指定した clock_gettime() です。

  • CLOCK_THREAD_CPUTIME_ID - スレッド固有の CPU 時間クロック。
  • CLOCK_PROCESS_CPUTIME_ID - CPU からのプロセスごとの高解像度タイマー。
  • CLOCK_MONOTONIC - 特定されていない開始点からの単調時間を表します。
  • CLOCK_REALTIME - システム全体のリアルタイム クロック。

ただし、gettimeofday() と同等の clock_gettime(CLOCK_REALTIME) を除いて、すべてのオプションがすべての Linux プラットフォームでサポートされているわけではないことに注意してください。

便利なリンク: clock_gettime を使用したプロファイリング コード

于 2010-03-28T18:11:32.057 に答える
0

gettimeofdayTuomas Pelkonenは、マイクロ秒単位の分解能で時間を取得できる方法をすでに発表しました。

彼の例では、続けて double に変換しています。timeval私は個人的に、カウントを秒単位とマイクロ秒単位で整数として保持し、加算と減算の操作を正しく処理する独自のクラスに構造体をラップしました。

私は、可能な限り浮動小数点数とそのすべての問題に到達するよりも、(正確な数学で) 整数を保持することを好みます。

于 2010-03-28T17:33:16.283 に答える