最近の端末は、主にグラフィックス カードが 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.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
(他のいくつかのコマンドを実行する必要があるかもしれません)、同等の場合は遅くなります。
疑わしい場合は、テストを実行してください...