web-dev-qa-db-ja.com

LinuxでCプログラムの実際の実行時間を測定する方法は?

私はこの質問が以前によく尋ねられた可能性があることを知っていますが、それらの質問のほとんどは経過時間時間(壁時計に基づく)コードの一部。コードのelapsed時間は、actual実行時間。対象のコードのelapsed時間中に他のプロセスが実行されている可能性があるため。

Getrusage()を使用してプロセスのユーザー時間とシステム時間を取得し、(ユーザー時間+システム時間)で実際の実行時間を計算しました。 Ubuntuでプログラムを実行しています。ここに私の質問があります:

  1. Getrusage()の精度を知るにはどうすればよいですか?
  2. Getrusage()よりも高い精度を提供できる他のアプローチはありますか?
23
Dillon Geo

カーネルの CPU Time 機能を利用して、Linux上のプロセスの実際のCPU時間を確認できます。

 #include <time.h>

 clock_t start, end;
 double cpu_time_used;

 start = clock();
 ... /* Do the work. */
 end = clock();
 cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

ソース: http://www.gnu.org/s/hello/manual/libc/CPU-Time.html#CPU-Time

このようにして、CPUティックまたはCPUがプロセスで処理した実際の命令数をカウントし、実際の作業時間を取得します。

19
Lars

Getrusage()関数は、「消費されたCPU時間」を取得するために私が知っている唯一の標準/ポータブルな方法です。

戻り値の精度を決定する簡単な方法はありません。 getrusage()を1回呼び出して初期値を取得し、返される値が初期値と異なるまで繰り返し呼び出し、次に、有効精度が初期値と最終値の差であると想定したいと思います値。これはハックです(精度がこの方法で決定されるよりも高くなる可能性があり、結果はおそらく最悪のケースの推定と見なされるはずです)が、何もしないよりはましです。

また、返される値の精度についても心配します。一部のカーネルでは、タイマーIRQが発生したときに実行中のコードが実行されると、カウンターが増加することを期待します。したがって、プロセスが非常に運が良い(そして、タイマーIRQが発生する直前に継続的にブロックする)か、非常に運が悪い(そして、タイマーIRQが発生する直前にブロックを解除する)ことが可能です。この場合、「ラッキー」はCPUホグがCPU時間をまったく使用していないように見えることを意味し、「アンラッキー」はCPU時間をほとんど使用しないプロセスがCPUホグのように見えることを意味します。

特定のアーキテクチャ上の特定のカーネルの特定のバージョン(場合によっては、特定の構成オプションを使用してカーネルをコンパイルするかどうか、またはいつコンパイルするかに依存します)には、移植性がなく、標準ではない、より高精度の選択肢がある可能性があります...

5
Brendan

次のコードを使用できます。

#include <sys/time.h>
struct timeval start, end;
gettimeofday(&start, NULL);
.
.
.
gettimeofday(&end, NULL);
delta = ((end.tv_sec  - start.tv_sec) * 1000000u +
         end.tv_usec - start.tv_usec) / 1.e6;
printf("Time is : %f\n",delta);

コードの実行時間を表示します

2
pooria