2

古典的な APUE (UNIX 環境での高度なプログラミング) のセクション 3.9 で、著者は、さまざまなバッファー サイズに対して実行されるサンプル プログラム (I/O 読み取り/書き込みプログラム) で消費されるユーザー/システム時間を測定しました。

結果テーブルは次のようになります (すべての時間は秒単位です):

BUFF_SIZE  USER_CPU   SYSTEM_CPU  CLOCK_TIME  LOOPS
1          124.89     161.65      288.64      103316352
...        
512        0.27       0.41        7.03        201789
...

プログラムの一部のユーザー/システム CPU 時間を測定する方法に興味があり、本当に疑問に思っていますか?

そして、この例では、CLOCK TIME平均とは何か、そしてそれをどのように測定するのでしょうか?

明らかに、これは単にユーザー CPU 時間とシステム CPU 時間の合計ではありません。

4

2 に答える 2

4

time次のコマンドを使用して、プログラムの実行時間を簡単に測定できます*nix

$ time myprog

real        0m2.792s
user        0m0.099s
sys         0m0.200s

またはは、実時間、つまりプログラムの開始から終了までにかかる時間を指し、カーネルコンテキストが他のプロセスを切り替えるときに他のプロセスが取るタイムスライスも含みますrealCLOCK_TIMEまた、プロセスがブロックされている時間も含まれます(I / Oイベントなど)

またはは、ユーザースペース、つまりカーネルの外部で費やされたCPU時間を指しますuserUSER_CPU時間とは異なり、real特定のプロセスで使用されるCPUサイクルのみを指します。

またははsysSYSTEM_CPU(システムコールの一部として)カーネル空間で費やされたCPU時間を指します。繰り返しますが、これはプロセスに代わってカーネルスペースで費やされたCPUサイクルのみをカウントし、ブロックされた時間はカウントしません。

timeユーティリティでは、とuserはまたはシステムコールsysのいずれかから計算されます。これは通常、プログラムの開始時と終了時にシステムコールを使用して収集された2つのタイムスタンプの時間差を使用して計算されます。times()wait()realgettimeofday()

あなたが知りたいかもしれないもう一つのことはですreal != user + sys。マルチコアシステムでは、userまたはsysまたはそれらの合計が非常に簡単にreal時間を超える可能性があります。

于 2013-03-15T07:54:39.007 に答える
2

部分的な答え:

さて、CLOCK_TIME は時計が示す時間と同じで、いわゆる「現実世界」での経過時間です。

これを測定する 1 つの方法は、gettimeofday POSIX 関数を使用することです。この関数は、 struct timevalUNIX の秒フィールドとマイクロ秒フィールドを含む、呼び出し元の に時間を格納します (実際の精度はしばしばこれより低くなります)。典型的なベンチマーク コードでそれを使用する例 (エラーなどを無視):

struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);

do_operation_to_measure();

gettimeofday(&tv2, NULL);

// get difference, fix value if microseconds became negative
struct timeval tvdiff = { tv2.tv_sec - tv1.tv_sec, tv2.tv_usec - tv1.tv_usec };
if (tvdiff.tv_usec < 0) { tvdiff.tv_usec += 1000000; tvdiff.tv_sec -= 1; }

// print it
printf("Elapsed time: %ld.%06ld\n", tvdiff.tv_sec, tvdiff.tv_usec);
于 2013-03-15T07:49:31.643 に答える