UNIXでtimeコマンドを使用することのオーバーヘッドは何であるか疑問に思いました。
使い方は知っていますが、コマンドの長さを知りたいです
$ time java HelloWorld
コマンドよりも端末を引き受ける
$ java HelloWorld
このオーバーヘッドが、実行中のプログラムの期間によってどのように変化するかに特に関心があります。
コンテキスト::Javaで記述された一連の長時間実行される実験にかかる時間を測定するために使用しています。
UNIXでtimeコマンドを使用することのオーバーヘッドは何であるか疑問に思いました。
使い方は知っていますが、コマンドの長さを知りたいです
$ time java HelloWorld
コマンドよりも端末を引き受ける
$ java HelloWorld
このオーバーヘッドが、実行中のプログラムの期間によってどのように変化するかに特に関心があります。
コンテキスト::Javaで記述された一連の長時間実行される実験にかかる時間を測定するために使用しています。
オーバーヘッドは固定されており、ソースコードに基づいて、追加のプロセス(time
プロセス自体)が開始され、少量の追加の処理が導入されているという事実のみが原因です(a)。通常、シェルはプログラムを開始しますが、この場合、シェルはプロセスを開始time
およびtime
開始します(を使用してfork
)。
この追加の処理には、次のものが含まれます。
fork
とexec
子供にかかった時間。測定中のプロセスが実行されている間、time
それ自体は(呼び出しを使用して)終了するのを待機しているだけなwait
ので、プロセスに影響はありません。
したがって、プロセスの起動時間time
は実際には測定に含まれますが、これらは非常に短いプロセスでのみ重要になります。プロセスがかなりの時間実行される場合、のオーバーヘッドtime
は関係ありません。
私がかなりの意味で言うと、非常に高速な実行可能ファイルで実行することで効果time
が得られることを確認できます。また、実行時間の長いプロセスのオーバーヘッドが大幅に増加するかどうかも確認できます。
pax> time sleep 0
real 0m0.001s
user 0m0.000s
sys 0m0.000s
pax> time sleep 1
real 0m1.001s
user 0m0.000s
sys 0m0.000s
pax> time sleep 10
real 0m10.001s
user 0m0.000s
sys 0m0.004s
pax> time sleep 100
real 1m40.001s
user 0m0.000s
sys 0m0.000s
つまり、ほとんど効果がありません。
さて、プロセスが長時間実行されている場合にのみプロセスのタイミングをとる可能性が高いため(連続して何度も実行しない限り、単一のプロセスに1ミリ秒または2ミリ秒かかるかどうかを気にするのは難しいです。パフォーマンスを向上させる方法)、の固定オーバーヘッドはtime
ますます重要ではなくなります。
(a):そして、time
組み込みのシェルを使用している場合(予約語など)、その小さなオーバーヘッドでさえ消えますbash
。time
プログラムのタイミングに関係なく、オーバーヘッドはtime
かなり一定である必要があります。タイムスタンプを取得し、プログラムを実行し、別のタイムスタンプを取得して結果を出力するだけです。
精度などの点で、実行しているプログラムが短いほど、プログラムへの影響time
は大きくなります。たとえば、「Hello World」での時間は、おそらく良い結果をもたらさないでしょう。時間のオーバーヘッドがノイズの中でかなり下がるので、まともな期間実行される何かの時間は非常に正確になります。