GNU/Linux >> Linux の 問題 >  >> Linux

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

最近の端末は、主にグラフィックス カードが 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
    
  • xterm で 、260x78:

    $ 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
    

私は佐藤桂の答えに本能的に同意しただろう。それは理にかなっている。ただし、テストするのは簡単です。

画面への 100 万行の書き込み、ファイルへの書き込み (追加)、および /dev/null へのリダイレクトをテストしました .これらを順番にテストし、5 回繰り返しました。これらは私が使用したコマンドです。

$ 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)

John Kugelman がコメントで指摘しているように、これにより多くのオーバーヘッドが追加されます。質問のとおり、これは実際にテストする正しい方法ではありませんが、 内から繰り返しファイルを再度開くコストが明確に示されているため、ここに残しておきます。 スクリプト自体。

この場合、結果は逆になります。


スクリプトを高速化するもう 1 つの方法は、より高速なシェル インタープリターを使用することです。 POSIX の速度を比較する ビジー ループ、bash で実行 v4.4ksh v93u+20120801 、および dash v0.5.8 .

<オール>
  • 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
    
  • 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
    
  • 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
    
  • サブセット コマンド数 bashksh dash のすべてのコマンドと下位互換性があります . bash そのサブセットのコマンドのみを使用するスクリプトは dash で動作するはずです .

    いくつかの bash 新しい機能を使用するスクリプトは、別のインタープリターに変換できます。 bash の場合 スクリプトは新しい機能に大きく依存しているため、わざわざ使う価値はないかもしれません -- 一部 新しい bash 機能は、コーディングが容易になり、改善されます。 より効率的 (bash にも関わらず) 一般に遅い)、そのため dash (他のいくつかのコマンドを実行する必要があるかもしれません)、同等の場合は遅くなります。

    疑わしい場合は、テストを実行してください...


    Linux
    1. Linux –画面上でスクリプトを実行する方法ロック/ロック解除?

    2. サービスがスクリプトで実行されているかどうかをテストする「適切な」方法は?

    3. 入力が「はい」の場合、スクリプトを再実行しますか?

    1. Bashでの$#の使用は何ですか

    2. 画面のロック/ロック解除でスクリプトを実行する方法は?

    3. SELinuxを学ぶ最良の方法は何ですか?

    1. awkスクリプトの最後にある1の意味は何ですか

    2. ディレクトリ内のすべてのファイルとサブフォルダーを削除する最速の方法は何ですか?

    3. echo バイナリを呼び出す最も安全で移植性の高い方法は何ですか?