スクリプトを実行する最速の方法は何ですか?

スクリプトを実行する最速の方法は何ですか?

スクリプトを実行する最速の方法が何であるか疑問に思います。端末にスクリプト出力を表示することとファイルにリダイレクトすること/dev/null

したがって、出力が重要でない場合は、少なくともスクリプトをより速く実行する最速の方法は何ですか?

bash ./myscript.sh 
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null

答え1

今日の端末は以前よりも遅いです。これは主にグラフィックカードがもはや2D加速を考慮していないためです。したがって、実際に端末に印刷すると、特にスクロールが含まれている場合は、スクリプトが遅くなる可能性があります。

したがって./script.sh、速度は遅くなりますが、後者が作業量が少ないため、./script.sh >script.log速度が遅くなります。/script.sh >/dev/nullただし、これが実際の目的に十分な影響を与えるかどうかは、スクリプトによって生成される出力の量と速度によって異なります。スクリプトが3行を書き込んで終了する場合、または数時間ごとに3ページを印刷する場合は、リダイレクトを処理する必要はありません。

編集する:いくつかのクイック(完全に壊れた)ベンチマーク:

  • Linuxコンソールで240x75:

    $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
    real    3m52.053s
    user    0m0.617s
    sys     3m51.442s
    
  • 260x78 xterm:

    $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
    real    0m1.367s
    user    0m0.507s
    sys     0m0.104s
    
  • Samsung SSD 850 PRO 512GBディスクのファイルにリダイレクト:

     $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >file)
     real    0m0.532s
     user    0m0.464s
     sys     0m0.068s
    
  • 次にリダイレクト/dev/null:

     $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null)
     real    0m0.448s
     user    0m0.432s
     sys     0m0.016s
    

答え2

私は本能的に同意します。佐藤桂の返信;その言葉になりますね。しかし、テストするのは簡単です。

画面に百万行を書き、ファイルに書き込む(追加)/dev/null、。これが私が使用するコマンドです。

$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log) 
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)

その後、以下に合計時間を表示しました。

時間対出力グラフ

ご覧のとおり、桂里推測は正しいです。 ~によると佐藤桂の返信、私も制限要素が出力であると思うので、出力選択がスクリプトの全体的な速度に重大な影響を与える可能性はほとんどありません。


FWIW、私の元の答えには、ファイルを追加して/dev/nullリダイレクトする別のコードがありました。~へサイクル。

$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done) 
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)

〜のようにジョン・クーゲルマン執筆時点のコメントで指摘したように、これにより多くのオーバーヘッドが追加されます。質問に関する限り、これは実際にテストする正しい方法ではありませんが、ファイルを繰り返し開くのにかかる費用を明確に示すため、ここに置きます。以内にスクリプト自体。

時間対出力グラフ

この場合、結果は逆です。

答え3

スクリプトを高速化する別の方法は、より高速なシェルインタプリタを使用することです。速度を比較してみてください。POSIX忙しいループ、実行中bash v4.4ksh v93u+20120801dash v0.5.8

  1. bash:

    time echo 'n=0;while [ $n -lt 1000000 ] ; do \
                      echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); 
                   done' | bash -s > /dev/null
    

    出力:

    real    0m25.146s
    user    0m24.814s
    sys 0m0.272s
    
  2. ksh:

    time echo 'n=0;while [ $n -lt 1000000 ] ; do \
                      echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); 
                   done' | ksh -s > /dev/null
    

    出力:

    real    0m11.767s
    user    0m11.615s
    sys 0m0.010s
    
  3. dash:

    time echo 'n=0;while [ $n -lt 1000000 ] ; do \
                      echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); 
                   done' | dash -s > /dev/null
    

    出力:

    real    0m4.886s
    user    0m4.690s
    sys 0m0.184s
    

サブセットbashとのコマンドは次のとおりkshです。以前のバージョンと互換性がありますのすべてのコマンドにdash。このサブセットのコマンドのみを使用するスクリプトは、とともにbash使用する必要がありますdash

bash新機能を使用する一部のスクリプトは、他のインタプリタに変換できます。bashスクリプトが最新の機能に大きく依存している場合は、問題を引き起こす価値はありません。一部bash機能が改善され、コーディングが簡単になりました。そしてより効率的であるため(通常はbash遅いですが)、それにdash対応するタスク(他の複数のコマンドの実行を含めることができます)はより遅くなります。

疑わしい場合はテストしてください...

関連情報