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.