スクリプトを実行する最速の方法が何であるか疑問に思います。端末にスクリプト出力を表示することとファイルにリダイレクトすること/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.4、ksh
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
ㅏサブセットbash
とのコマンドは次のとおりksh
です。以前のバージョンと互換性がありますのすべてのコマンドにdash
。このサブセットのコマンドのみを使用するスクリプトは、とともにbash
使用する必要がありますdash
。
bash
新機能を使用する一部のスクリプトは、他のインタプリタに変換できます。bash
スクリプトが最新の機能に大きく依存している場合は、問題を引き起こす価値はありません。一部新bash
機能が改善され、コーディングが簡単になりました。そしてより効率的であるため(通常はbash
遅いですが)、それにdash
対応するタスク(他の複数のコマンドの実行を含めることができます)はより遅くなります。
疑わしい場合はテストしてください...