スクリプトの実行時間は大きく異なります。 Matlabのtimeitに似た時間関数を探したいです。ここ。
たとえば、次のコマンドを評価しています。ここすばやく計算される一致に対してtime LC_ALL=C grep -ao CDA r328_0002.raw | wc -l
ループを実行する
---------------------------------------------
Events real user sys
----------- ----------- ----------- ---------
40 0m0.044s 0m0.042s 0m0.005s
40 0m0.064s 0m0.062s 0m0.005s
40 0m0.046s 0m0.044s 0m0.005s
40 0m0.043s 0m0.042s 0m0.005s
40 0m0.047s 0m0.044s 0m0.005s
---------------------------------------------
Table: Events when Macbook Air 2013-Mid in Power Supply.
---------------------------------------------
Events real user sys
----------- ----------- ----------- ---------
40 0m0.056s 0m0.041s 0m0.011s
40 0m0.060s 0m0.047s 0m0.008s
40 0m0.041s 0m0.039s 0m0.006s
40 0m0.046s 0m0.044s 0m0.006s
40 0m0.047s 0m0.045s 0m0.006s
---------------------------------------------
Table: Events when Macbook Air in Battery Supply, 6h later.
リアルタイム時間は0.044秒から0.064秒に変動し、ユーザー時間は0.042秒から0.062秒に変動し、システム時間は0.005秒に安定していることがわかります。時間についての私の考え
- タイミング前にコマンドを1k繰り返す
- 10回のタイミングを測定して平均と標準偏差をとる
厚い /dev/nul
このアイデアは lcd047 のコメントにあり、time LC_ALL=C ggrep -ao CDA r328_0002.raw >/dev/null
ループで実行されます。
--------------------------------------------
real user sys
-------------- -------------- ------------
0m0.006s 0m0.003s 0m0.002s
0m0.006s 0m0.003s 0m0.002s
0m0.006s 0m0.003s 0m0.002s
0m0.008s 0m0.003s 0m0.003s
0m0.006s 0m0.003s 0m0.002s
0m0.005s 0m0.002s 0m0.002s
0m0.006s 0m0.002s 0m0.002s
0m0.009s 0m0.003s 0m0.003s
0m0.007s 0m0.003s 0m0.003s
0m0.006s 0m0.003s 0m0.002s
0m0.006s 0m0.003s 0m0.002s
0m0.008s 0m0.003s 0m0.003s
--------------------------------------------
Table: Events when Macbook Air 2013-Mid in Battery Supply.
ノートパソコンに電源が入っていて実行中のプログラムが少ない場合は、この時間をさらに改善できると思います。
シェルスクリプトの時間を確実に測定する方法は?
答え1
私の答えはいいえ! Linuxはリアルタイムシステムではありません。 UNIXとLinuxの哲学は、システムが複数のユーザーとシステムプロセスで共有されている間に最短の応答時間を提供することです。起動コマンドのタイミングによっては、重要なシステムプロセスがプロセッサ時間を割り当てるのを待つ必要があるかもしれません。さらに、ファイルシステムはディスクから読み取られたファイルをバッファリングできますが、最終的にシステムの他のプロセスがファイルを所有している場合、これらのファイルシステムバッファはキャッシュからデータをロードできません。一般的に、Linuxシステムでプロセスにかかる時間は、宇宙の時間とスペースに関係なく、システムの周りのエントロピーに依存します。
ライブチューニング専用のライブシステムとコマンドと、あなただけのために予約されている特定の量のリソースが必要です。プロセッサ、メモリの一部、環境の基本ファイルシステム自体の反映をスケジュールできる最新のカーネルの新しいCGROUP機能を使用すると、同様の結果が得られます。
あなたの例の主なタイミング問題の1つは、grepとwcが入力を読み取る方法です。ファイルをramfsにコピーして作業するときは、タイミングをより安定させることができます。
答え2
まず、シェルスクリプトは、ユーザーが直接入力するコマンドを簡単に短縮できることを理解する必要があります。ユーザーまたはスクリプトが呼び出すたびに組み込みのgrep
基本要素を呼び出すわけではありません。シェルに名前が付けられたプログラムを見つけ、grep
新しいプロセスで開始するように要求します。新しいプロセスを作成して最初のコードを実行することは、予測可能性が調整されていないすべての環境でおそらく最も予測するのが難しいことです。これは、リアルタイムではなくオペレーティングシステムを実行しているすべてのコンピュータに当てはまります。なぜこれが起こるのかについての詳細は、オペレーティングシステムの半学期コースの資料であるかもしれませんが、プログラム全体の実行を正確に測定しようとする努力が期待された一貫した結果を得ることができない理由の1つまたは2つの例を示します。あります。
ほとんどのプログラムが最初にCPUを取得するときに最初にすることは、コードの最初のページがロードされるようにページフォールトを生成することです。コードを持つ同じデバイスでI / Oを実行する12の異なるプログラムがある場合、プログラムページをロードするのにかかる時間は、要求がデバイスキュー内の場所によって異なります。テストプログラムが独立して実行されると思うかもしれませんが、実際にはそうではありません。 (これはgrep
I / Oバインドされたプログラムなので、入力を読み取るのにかかる時間は同じ理由でさまざまであることにも言及する価値があります。)
多くのオペレーティングシステムは、メモリ消費量を減らし、パフォーマンスを向上させるために同じコードの重複コピーが同時に存在しないように対策を講じています。つまり、起動しgrep
て最初のページが既に存在している間に別のページをgrep
実行している場合、上記のページエラーは発生せず、すべての操作をスキップします。これにより壁時計の動作時間が短縮されます。
MATLABで実行を開始すると、timeit
MATLABプロセスはすでに実行中であるため、関数を繰り返し呼び出す前に関数をロードするために必要なプロセスを超えることができます。内部通話なので、通話はかなり速く行われます。実行にかかる時間に影響を与える他の多くの要素がありますが、timeit
他の要素にも適用されます。
つまり、皆さんが見ている本当の理由は、この比較がリンゴとリンゴの比較ではないからだと思います。
Unixはtime(1)
テスト中のプログラムを一度だけ実行しますが、MATLABはtimeit
テスト中の関数に複数回乗算し、結果の中央値を返します。この記事では、andとtimeit
機能を一緒に使用してはいけないことを提案しています。つまり、後者が前者で使用されることを意味する。ドキュメントでは、コードの実行に0.1秒未満がかかる場合は、複数回実行して平均を計算することをお勧めします。私が得た結論は、MATLABのタイミング比が2倍ほど正確でなく、長期実行機能でどのくらいの時間を節約できるかを確認するのに良いことです。十分なサンプルが与えられると、平均値と中央値を組み合わせると、かなり一貫した結果に向かって大量の変動が生じる。tic
toc
tic
toc
time(1)