Subshells mají režii.
V mém systému jsou minimální náklady na fork-exec (když spouštíte program z disku, když soubor není studený) asi 2ms
a minimální cena rozvětvení je asi 1ms
.
U subshellů mluvíte pouze o ceně rozvětvení, protože žádný soubor nemusí být exec
vyd. Pokud jsou podskořápky udržovány na rozumně nízké úrovni, 1ms
je v programech zaměřených na člověka zcela zanedbatelný. Věřím, že lidé si nemohou všimnout ničeho, co se děje rychleji než 50ms
(a tak dlouho trvá, než se moderní interpreti skriptovacích jazyků vůbec spustí (mluvím python
a ruby v rvm
zde) s nejnovějším nodejs
zabírající kolem 100ms
).
Sčítá se však se smyčkami a pak možná budete chtít nahradit například poměrně běžné bactic nebo $()
vzor, kde jste return
něco z funkce jejím vytištěním na stdout pro nadřazený shell, aby bylo možné vylepšit bashismy jako printf -v
(nebo použijte rychlý externí program ke zpracování celé dávky).
Balíček bash-completion se konkrétně vyhýbá těmto nákladům na subshell tím, že se vrací přes předané názvy proměnných pomocí techniky popsané na http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
Porovnávám
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
s
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
by vám měl poskytnout dobrý odhad toho, co vaše systémy fork
-ing režie je.