Le subshell hanno un sovraccarico.
Sul mio sistema, il costo minimo di fork-exec (quando si esegue un programma dal disco quando il file non è freddo) è di circa 2ms
e il costo minimo del fork è di circa 1ms
.
Con le subshell, stai parlando solo del costo del fork, poiché nessun file deve essere exec
ed. Se le subshell sono mantenute ragionevolmente basse, 1ms
è abbastanza trascurabile nei programmi rivolti all'uomo. Credo che gli umani non possano notare nulla che accade più velocemente di 50ms
(ed è quanto tempo impiegano i moderni interpreti di linguaggi di scripting anche solo per iniziare (sto parlando di python
e rubino in rvm
qui) con il nodejs
più recente occupando circa 100ms
).
Tuttavia, si somma con i loop, e quindi potresti voler sostituire ad esempio il piuttosto comune batick o $()
pattern dove si return
qualcosa da una funzione stampandolo su stdout affinché la shell genitore possa catpure con bashismi come printf -v
(o utilizzare un programma esterno veloce per elaborare l'intero batch).
Il pacchetto bash-completion evita specificamente questo costo della subshell restituendo tramite nomi di variabili passati usando una tecnica descritta su http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
Confronto
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
con
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
dovrebbe darti una buona stima di ciò che i tuoi sistemi fork
-ing overhead è.