Каковы накладные расходы на использование подоболочек?

Надеюсь, этот вопрос не слишком общий. Я очень новичок в сценариях оболочки, и я исхожу из компьютерной архитектуры / не-скриптового программирования. Я заметил в сценариях на моей работе, что редко скрипты написаны путем создания суб-оболочки вокруг всего скрипта. В сценариях, которые я пишу, когда я могу окутать его с помощью суб-оболочки, я с тех пор, как он не вмешивается в другие сценарии, которые называют мои (на всякий случай). Разве это не обычная практика из-за некоторых накладных расходов, связанных с этим подходом? Мне сложно найти это в Интернете.

Пример:

#!/bin/bash ( #Start of subshell echo "Some stuff here" ) #End of subshell 

У подсетей есть накладные расходы.

В моей системе минимальная стоимость fork-exec (когда вы запускаете программу с диска, когда файл не холодный) составляет около 2 2ms а минимальная стоимость вилки составляет около 1 1ms .

С подоболочками вы говорите только о стоимости на forking, поскольку файл не должен исполняться. Если подоболочки поддерживаются разумно низкими, 1 1ms совершенно ничтожно мала в программах, ориентированных на человека. Я считаю, что люди не замечают ничего, что случается быстрее, чем 50ms (и это то, как долго он стремится к тому, чтобы современные интерпретаторы языка сценариев даже начали (я говорю о python и ruby ​​в rvm здесь) с новейшими nodejs занимающими около 100ms ).

Тем не менее, он объединяется с циклами, и тогда вам может потребоваться заменить, например, довольно распространенный шаблон bactick или $() , в котором вы return что-то из функции, печатав его в stdout для родительской оболочки, чтобы преклониться с такими бахизмами, как printf -v (или использовать быструю внешнюю программу для обработки всей партии).

Пакет завершения bash специально избегает этой стоимости подоболочки, возвращаясь через переданные имена переменных, используя метод, описанный по адресу http://fvue.nl/wiki/Bash:_Passing_variables_by_reference


Сравнение

 time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null 

с

 time for((i=0;i<10000;i++)); do echo hello; done >/dev/null 

должен дать вам хорошую оценку того, что ваши системные fork накладные расходы.