サブシェルにはオーバーヘッドがあります。
私のシステムでは、最小限の fork-exec コスト (ファイルがコールドでないときにディスクからプログラムを実行する場合) は約 2ms
です。 最小限の分岐コストは約 1ms
です .
サブシェルでは、ファイルを exec
にする必要がないため、フォークのコストだけを話していることになります。 編。サブシェルが適度に低く保たれている場合、1ms
人間向けのプログラムではごくわずかです。人間は 50ms
よりも速く発生するものに気付くことができないと思います (これは、最新のスクリプト言語インタープリターが開始するまでにかかる傾向がある時間です (私が話しているのは python
です) rvm
のルビー こちら) 最新の nodejs
100ms
あたりを占める ).
ただし、ループが追加されるため、たとえば、かなり一般的な bactick または $()
を置き換えたい場合があります。 return
のパターン 親シェルが printf -v
のようなバシズムでキャッチするために、関数から何かを標準出力に出力する (または高速な外部プログラムを使用してバッチ全体を処理します)。
bash-completion パッケージは、http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
で説明されている手法を使用して、渡された変数名を介して返すことにより、このサブシェル コストを明確に回避します。比較中
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
と
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
システムの fork
を適切に見積もることができます。 -ing オーバーヘッドは.