2011-12-21 79 views
5

linuxでプログラムを実行するのに要した時間をマイクロ秒単位(またはより正確に)に知りたい。現在はtimeコマンドを使用していますが、最大ミリ秒の精度で表示されます。 timeコマンドを微調整してより正確な精度を得る方法はありますか?同じコマンドがありますか?linux timeコマンドマイクロ秒以上の精度

答えて

8

あなたの質問は意味がありません。レポートしても数ミリ秒以内に測定を繰り返すことはありません。

数字を追加するだけでノイズが追加されます。余分な数字を/dev/randomから引き出すこともできます。

+0

私はあなたのことを理解していません。今日のプロセッサでは不可能ではないミリ秒より正確さが求められ、ナノ秒の精度まで向上させることができます。数字を増やすとノイズが増えますか? –

+5

@Guidance非リアルタイムOS上で動作するコードは、決定論的な実行をしないためです。それは、OSがいくつかのIPパケットや他の任意のプロセスを実行したり、クラウドが何かをすべきかどうかを調べたり、ファイルシステムがダーティページなどを書き出すべきかどうかをチェックしたり、いくつかの(少量の)時間のために再タイミングが中断され、タイミングがオフになります。 CPU時間(壁時計時間とは対照的に)などのOSの組み込みタイミングは、通常、一定の解像度(多くの場合1カーネルティック、1ミリ秒以上)を持つタイムスライスでカウントされます – nos

+0

'time /ビン/スリープ0.006 'は、ノイズが1ミリ秒未満であることを示すようである。そのような測定は間違いなく危険ですが、Guanideneの要請自体は意味がありません。 –

0

current_kernel_time()があなたの要件に役立つかどうかを参照してください。 私はそれを使用しており、ナノ秒レベルに粒度を与えるので有用であることがわかりました。 詳細はhereです。

4

私はEmployed Russian's answerと同意します。このような尺度では、マイクロ秒の精度を求めるのはあまり意味がありません。だから、あなたが持っている追加の数字は無意味です(と本質的にランダム)。

測定するアプリケーションのソースコードをお持ちの場合は、clockまたはclock_gettime関数を使用することができますが、十数マイクロ秒の精度よりも良いとは限りません。 RDTSC機械命令もあります。

linux clock howtoをお読みください。

実行のタイミングは、アプリケーションの観点から、非決定論的で非再現性のないものであることを忘れないでください(コンテキストスイッチ、キャッシュミス、割り込みなどをランダムに考える)。

プログラム全体のパフォーマンスを測定したい場合は、少なくとも数秒間実行し、数回(たとえば8回)時間を測定し、平均値を取る(おそらく最悪のタイミング&)。あなたが特定の機能のためのタイミングを測定したい場合は

、アプリケーションprofileする方法を学ぶ(gprofを、oprofileなどなど...) も参照this question

time(7)

BEを読むことを忘れないでください現在の(ラップトップ、デスクトップ、サーバ)out-of-orderpipelinedsuperscalarプロセッサーがCPU cachesTLBbranch predictorsの複雑なマシン命令iの実行時間再現性がありません(ナノ秒のカウントは実行ごとに異なります)。またOSはランダム性(scheduling,context switches,interrupts,page cache,copy-on-write,demand-paging ...)を追加しているので、何かのコマンドの実行を1ミリ秒以上(おそらく100μs)と測定しても意味がありません。精度のあなたはあなたのコマンドを何度もベンチマークするべきです。

ベンチマーク済みのアプリケーションを数秒以上実行するように変更する必要があります(おそらくmainにループを追加するか、より大きなデータセットを使用して実行します)。そして、ベンチマークされたコマンドをダース回。それは、測定値の平均値(または最悪値、または最善値、あなたの後ろに依存する)を取ります。

システムtime(1)で十分でない場合は、独自の測定機能を作成することがあります。 getrusage(2)も参照してください。私はあなたがより正確な措置を取っていることについて懐疑的です。

ところで、私のi3770K最近のGNU/Linuxの(4.2カーネル、Debianの/シド/ x86-64で)上のデスクトップコンピュータ、避ける約3または4ナノ秒単位でtime(2)またはclock_gettime(2)実行するような "システム" -calls(vdso(7)のおかげで実際の負担はsyscall ...)ですので、の中にのプログラムをよく使うことができます。

2

gettimeofdayを使用 - マイクロ秒の精度を与えます

関連する問題