Мне было интересно, есть ли общие рекомендации по оптимизации скриптов Bash.
Например, удобнее писать циклы, чем строки команд, но быстрее ли это обрабатывать в системе? Пример:
for i in a b c; do echo $i; done echo a echo b echo c
Иногда люди представляют разные решения для одной и той же проблемы. Так , например,
sed
,cut
,awk
, иecho
все способны лишить цифры из строки. Мне было интересно, если вы можете сказать, что чем меньше цифр кода, тем быстрее, если вы используете:та же команда, например
STRING=abc.def echo ${STRING} | sed 's/.def//g' echo ${STRING} | sed '$s/....$//'
разные команды, например
STRING=abc.def echo ${STRING} | cut -d . -f 1 echo ${STRING} | sed 's/.def//g'
shell-script
Винсент
источник
источник
Ответы:
Оболочки не выполняют никакой реорганизации передаваемого ими кода, они просто интерпретируются одна строка за другой (в интерпретаторе команд больше ничего не имеет смысла). Большая часть времени, проводимого оболочкой, уходит на лексический анализ / анализ / запуск вызываемых программ.
Для простых операций (таких, как те, что приводятся в примерах в конце вопроса), я был бы удивлен, если бы время загрузки программ не перекрывало ничтожные различия в скорости.
Мораль этой истории заключается в том, что если вам действительно нужно больше скорости, вам лучше использовать (полу) скомпилированный язык, такой как Perl или Python, который быстрее запускается для запуска, в котором вы можете написать многие из упомянутых операций. и не нужно вызывать внешние программы, и имеет возможность вызывать внешние программы или вызывать в оптимизированные модули C (или любые другие) для выполнения большей части работы. Вот почему в Fedora «сахар для системного администрирования» (по сути, GUI) написан на Python: может добавить приятный графический интерфейс без особых усилий, достаточно быстрый для таких приложений, иметь прямой доступ к системным вызовам. Если этого недостаточно, возьмите C ++ или C.
Но не ходите туда, если только вы не докажете, что выигрыш в производительности стоит потери гибкости и времени разработки. Скрипты оболочки не так уж плохи для чтения, но я содрогаюсь, когда вспоминаю некоторые скрипты, используемые для установки Ultrix, которые я однажды пытался расшифровать. Я сдался, слишком много «оптимизации сценариев оболочки» было применено.
источник
Первое правило оптимизации: не оптимизируйте . Проверьте сначала. Если тесты показывают, что ваша программа работает слишком медленно, ищите возможные оптимизации.
Единственный способ убедиться в этом - это сравнить его с вашим вариантом использования. Существуют некоторые общие правила, но они применяются только для типичных объемов данных в типичных приложениях.
Некоторые общие правила, которые могут быть или не быть правдой в любых конкретных обстоятельствах:
echo $foo
медленнее, чемecho "$foo"
, потому что без двойных кавычек он разбивается$foo
на слова и интерпретирует каждое слово как шаблон подстановочного имени файла. Что еще более важно, такое поведение расщепления и сглаживания редко желательно. Поэтому не забывайте всегда ставить двойные кавычки вокруг подстановок переменных и подстановок команд:"$foo"
,"$(foo)"
.cut
илиhead
могут быть эмулированыsed
, ноsed
будут медленнее иawk
медленнее. Обработка строки оболочки выполняется медленно, но для коротких строк она в значительной степени превосходит вызов внешней программы.В сценариях оболочки редко возникает проблема с производительностью. Приведенный выше список является чисто ориентировочным; в большинстве случаев совершенно нормально использовать «медленные» методы, поскольку разница часто составляет долю процента.
Обычно целью сценария оболочки является быстрое выполнение чего-либо. Вы должны извлечь много пользы из оптимизации, чтобы тратить лишние минуты на написание сценария.
источник
python
иruby
определенно медленнее запускается, по крайней мере, в моей системе,perl
запускаться так же быстро, какbash
иksh
. GNU awk значительно медленнее, чем GNU sed, особенно в локалях utf-8, но это не относится ко всем awk и всем seds. ksh93> dash> pdksh> zsh> bash не всегда так ясен. Некоторые снаряды лучше в некоторых вещах, чем другие, и победитель не всегда одинаков.Украдено из распространенных ошибок сценария оболочки от Pádraig Brady.
источник
for i in *; do wc -l "$i">/dev/null; done
лучше делатьfor i in *; do wc -l "$i"; done>/dev/null
.time
cmdwc -l
, проверьте, я обновил в публикации ваш вывод