Les sous-shells ont une surcharge.
Sur mon système, le coût minimal de fork-exec (lorsque vous exécutez un programme à partir du disque lorsque le fichier n'est pas froid) est d'environ 2ms
et le coût de bifurcation minimal est d'environ 1ms
.
Avec les sous-shells, vous ne parlez que du coût de la bifurcation, car aucun fichier n'a besoin d'être exec
éd. Si les sous-shells sont maintenus raisonnablement bas, 1ms
est tout à fait négligeable dans les programmes destinés aux humains. Je crois que les humains ne peuvent rien remarquer qui se passe plus vite que 50ms
(et c'est le temps qu'il faut pour que les interpréteurs de langage de script modernes commencent même (je parle de python
et rubis en rvm
ici) avec le dernier nodejs
environ 100ms
).
Cependant, cela s'additionne avec des boucles, et vous voudrez peut-être remplacer par exemple le bactick plutôt commun ou $()
modèle où vous return
quelque chose d'une fonction en l'imprimant sur stdout pour que le shell parent capture avec des bashismes comme printf -v
(ou utilisez un programme externe rapide pour traiter l'ensemble du lot).
Le package bash-completion évite spécifiquement ce coût de sous-shell en retournant via des noms de variables passés en utilisant une technique décrite sur http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
Comparer
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
avec
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
devrait vous donner une bonne estimation de ce que vos systèmes fork
-ing frais généraux est.