Subshells têm sobrecarga.
No meu sistema, o custo mínimo do fork-exec (quando você executa um programa a partir do disco quando o arquivo não está frio) é de cerca de 2ms
e o custo mínimo de bifurcação é de cerca de 1ms
.
Com subshells, você está falando apenas do custo de bifurcação, já que nenhum arquivo precisa ser exec
ed. Se as subshells forem mantidas razoavelmente baixas, 1ms
é bastante insignificante em programas voltados para humanos. Eu acredito que os seres humanos não podem perceber nada que aconteça mais rápido do que 50ms
(e demorará para que os intérpretes modernos de linguagem de script iniciem (eu estou falando python
e ruby em rvm
aqui) com o mais recente nodejs
ocupando 100ms
).
No entanto, soma-se com loops e, em seguida, você pode querer substituir, por exemplo, o padrão de bactick ou $()
, em que return
de uma função é imprimida para stdout para o shell pai para catpure com bashisms como printf -v
(ou use um programa externo rápido para processar todo o lote).
O pacote de conclusão do bash especificamente evita esse custo de subshell retornar via nomes de variáveis passadas usando uma técnica descrita em link
Comparando
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
com
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
deve dar uma boa estimativa do que seus sistemas fork
-ing sobrecarga é.