シェルスクリプトインタープリターのパフォーマンス特性を示すために、上記のグロビングの例をここで展開します。30,000のファイルごとにプロセスが生成されるこの例のbash
とdash
インタープリターを比較すると、ダッシュがwc
プロセスのフォークをほぼ2倍高速化できることがわかります。bash
bash-4.2$ time dash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real 0m1.238s
user 0m0.309s
sys 0m0.815s
bash-4.2$ time bash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real 0m1.422s
user 0m0.349s
sys 0m0.940s
wc
プロセスを呼び出さずに基本ループ速度を比較すると、ダッシュのループがほぼ6倍速いことがわかります。
$ time bash -c 'for i in *; do echo "$i">/dev/null; done'
real 0m1.715s
user 0m1.459s
sys 0m0.252s
$ time dash -c 'for i in *; do echo "$i">/dev/null; done'
real 0m0.375s
user 0m0.169s
sys 0m0.203s
以前に示したように、どちらのシェルでもループはまだ比較的遅いため、スケーラビリティーのために、コンパイルされたプロセスで反復が実行されるように、より機能的な手法を使用する必要があります。
$ time find -type f -print0 | wc -l --files0-from=- | tail -n1
30000 total
real 0m0.299s
user 0m0.072s
sys 0m0.221s
上記は断然最も効率的なソリューションであり、シェルスクリプトでできる限り少ないことを実行し、UNIXシステムで利用可能な豊富なユーティリティセットで利用可能な既存のロジックを接続するためだけに使用することを目的としています。
PádraigBradyによる一般的なシェルスクリプトの間違いから盗まれた。