Subshells haben Overhead.
Auf meinem System betragen die minimalen Fork-Exec-Kosten (wenn Sie ein Programm von der Festplatte ausführen, wenn die Datei nicht kalt ist) etwa 2ms und die minimalen Forking-Kosten betragen etwa 1ms .
Bei Subshells sprechen Sie nur von den Forking-Kosten, da keine Datei exec sein muss ed. Wenn die Subshells angemessen niedrig gehalten werden, 1ms ist in benutzerorientierten Programmen ziemlich vernachlässigbar. Ich glaube, Menschen können nichts bemerken, was schneller als 50ms passiert (und so lange dauert es in der Regel, bis moderne Skriptsprachen-Interpreter überhaupt anfangen (ich spreche von python und Rubin in rvm hier) mit dem neusten nodejs ungefähr 100ms einnehmen ).
Allerdings summiert es sich bei Schleifen, und dann möchten Sie vielleicht zum Beispiel das eher übliche Bactick oder $() ersetzen Muster, wo Sie return etwas aus einer Funktion, indem Sie es auf stdout ausgeben, damit die übergeordnete Shell mit Bashismen wie printf -v catpure (oder verwenden Sie ein schnelles externes Programm, um den gesamten Stapel zu verarbeiten).
Das bash-completion-Paket vermeidet speziell diese Subshell-Kosten, indem es über übergebene Variablennamen zurückgibt, wobei eine Technik verwendet wird, die unter http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
beschrieben wirdVergleich
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
mit
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
sollte Ihnen eine gute Einschätzung dessen geben, was Ihr System fork ausmacht -ing Overhead ist.