シェルスクリプトの時間は安定していますか?

シェルスクリプトの時間は安定していますか?

スクリプトの実行時間は大きく異なります。 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の異なるプログラムがある場合、プログラムページをロードするのにかかる時間は、要求がデバイスキュー内の場所によって異なります。テストプログラムが独立して実行されると思うかもしれませんが、実際にはそうではありません。 (これはgrepI / Oバインドされたプログラムなので、入力を読み取るのにかかる時間は同じ理由でさまざまであることにも言及する価値があります。)

多くのオペレーティングシステムは、メモリ消費量を減らし、パフォーマンスを向上させるために同じコードの重複コピーが同時に存在しないように対策を講じています。つまり、起動しgrepて最初のページが既に存在している間に別のページをgrep実行している場合、上記のページエラーは発生せず、すべての操作をスキップします。これにより壁時計の動作時間が短縮されます。

MATLABで実行を開始すると、timeitMATLABプロセスはすでに実行中であるため、関数を繰り返し呼び出す前に関数をロードするために必要なプロセスを超えることができます。内部通話なので、通話はかなり速く行われます。実行にかかる時間に影響を与える他の多くの要素がありますが、timeit他の要素にも適用されます。

つまり、皆さんが見ている本当の理由は、この比較がリンゴとリンゴの比較ではないからだと思います。

Unixはtime(1)テスト中のプログラムを一度だけ実行しますが、MATLABはtimeitテスト中の関数に複数回乗算し、結果の中央値を返します。この記事では、andとtimeit機能を一緒に使用してはいけないことを提案しています。つまり、後者が前者で使用されることを意味する。ドキュメントでは、コードの実行に0.1秒未満がかかる場合は、複数回実行して平均を計算することをお勧めします。私が得た結論は、MATLABのタイミング比が2倍ほど正確でなく、長期実行機能でどのくらいの時間を節約できるかを確認するのに良いことです。十分なサンプルが与えられると、平均値と中央値を組み合わせると、かなり一貫した結果に向かって大量の変動が生じる。tictoctictoctime(1)

関連情報