Сценарий Bash; оптимизация скорости обработки

Это означало бы учетную запись, отключенную для основанного на пароле входа в систему. Учетная запись с пустым паролем будет иметь пустое поле.

10
15.10.2019, 18:46
3 ответа

Оболочки не делают никакой перестройки кода, который им вручают, это просто интерпретируется одна строка после другого (ничто иное действительно очень не распознается в интерпретаторе команд). Большая часть времени, проведенного оболочкой, переходит к лексическому анализу/парсингу/запуску названные программы.

Для простых операций (как те портящие строки в примерах в конце вопроса) я был бы удивлен, не затопляет ли время для загрузки программ крохотных различий в скорости.

Мораль истории - то, что при реальной необходимости в большей скорости Вы более обеспечены с (полу) скомпилированным языком как Perl или Python, который быстрее для выполнения для начала, в котором Вы можете записать многие операции, упомянутые непосредственно, и не должны обращаться к внешним программам, и имеет опцию вызвать внешние программы или вызов в оптимизированный C (или безотносительно) модули, чтобы сделать большую часть задания. Это - причина, почему в Fedora "сахар системного администрирования" (графический интерфейсы пользователя, по существу) записаны в Python: Может добавить хороший GUI с не слишком много усилия, достаточно быстро для таких приложений, иметь прямой доступ к системным вызовам. Если это не достаточно скорости, захват C++ или C.

Но не идите туда, если Вы не можете доказать, что увеличение производительности стоит потери в гибкости и время разработки. Сценарии оболочки не слишком плохи для чтения, но я дрожу, когда я помню, что некоторые сценарии раньше устанавливали Ultrix, который я когда-то пытался дешифровать. Я сдался, слишком много "оптимизации сценария оболочки" было применено.

8
27.01.2020, 19:59
  • 1
    +1, но много людей утверждал бы, что, более вероятно, будет усиление в гибкости и время разработки с помощью чего-то как Python или жемчуг по сравнению с оболочкой, не потеря. Я сказал бы, только используют сценарий оболочки, если он требуется, или что Вы делаете, включает обильную сумму оболочки определенные команды. –  goldilocks 06.03.2013, 18:47

Первое правило оптимизации: не оптимизировать. Тест сначала. Если тесты показывают, что Ваша программа является слишком медленной, ищите возможную оптимизацию.

Единственный способ быть уверенным состоит в том, чтобы сравнить для Вашего варианта использования. Существуют некоторые общие правила, но они только запрашивают типичные объемы данных в типовых приложениях.

Некоторые общие правила, которые могут или не могут быть верными ни при каком конкретном обстоятельстве:

  • Для внутренней обработки в оболочке ATT ksh является самым быстрым. Если Вы делаете много обработок строк, используйте ATT ksh. Тире приходит вторым; удар, pdksh и zsh отстают.
  • Если необходимо вызвать оболочку часто для выполнения очень короткой задачи каждый раз, победы тире из-за его низкого времени запуска.
  • Запуск внешнего времени производственных издержек, таким образом, это быстрее, чтобы иметь один конвейер со сложными частями, чем конвейер в цикле.
  • echo $foo медленнее, чем echo "$foo", потому что без двойных кавычек, это разделяет $foo в слова и интерпретирует каждое слово как подстановочный шаблон имени файла. Что еще более важно, то разделение и globbing поведение редко желаемы. Поэтому не забудьте всегда помещать двойные кавычки вокруг замен команды и подстановок переменных: "$foo", "$(foo)".
  • Специальные инструменты имеют тенденцию выигрывать универсальные инструменты. Например, инструменты как cut или head может быть эмулирован с sed, но sed будет медленнее и awk будет еще медленнее. Строковая обработка Shell является медленной, но для коротких строк она в основном бьет вызов внешней программы.
  • Более усовершенствованные языки, такие как Perl, Python и Ruby часто позволяют Вам записать более быстрые алгоритмы, но у них есть значительно более высокое время запуска, таким образом, они только стоят того для производительности для больших объемов данных.
  • На Linux, по крайней мере, каналы имеют тенденцию быть быстрее, чем временные файлы.
  • Большая часть использования сценариев оболочки вокруг процессов I/O-bound, таким образом, потребление ресурсов ЦП не имеет значения.

Редко, чтобы производительность была беспокойством в сценариях оболочки. Список выше чисто показателен; это прекрасно подходит для использования “медленных” методов в большинстве случаев, поскольку различием часто является часть процента.

Обычно точка сценария оболочки должна получить что-то сделанное быстро. Необходимо получить много от оптимизации для выравнивания по ширине тратящих дополнительных минут, пишущий сценарий.

21
27.01.2020, 19:59
  • 1
    В то время как python и ruby определенно медленнее для запуска, по крайней мере, в моей системе, perl так же быстро для запуска как bash или ksh. GNU awk значительно медленнее, чем GNU sed особенно в utf-8 локалях, но он не верен для всего awks и всех семян. ksh93> тире> pdksh> zsh> удар не всегда так ясен. Некоторые оболочки лучше в некоторых вещах, чем другие, и победитель является не всегда тем же. –  Stéphane Chazelas 09.03.2013, 14:33
  • 2
    , "необходимо получить много от...": если "Вы" включаете базу пользователей, верную. Со сценариями оболочки в популярных пакетах Linux часто пользователи коллективно тратят впустую несколько порядков величины больше времени, чем поспешный программист сохраняет. –  agc 01.01.2017, 19:25

Мы расширимся здесь на нашем globbing примере выше для иллюстрирования некоторых рабочих характеристик интерпретатора сценария оболочки. Сравнение bash и dash интерпретаторы для этого примера, где процесс порожден для каждого из 30 000 файлов, показывают, что тире может разветвиться wc процессы почти дважды с такой скоростью, как bash

bash-4.2$ time dash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real    0m1.238s
user    0m0.309s
sys     0m0.815s


bash-4.2$ time bash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real    0m1.422s
user    0m0.349s
sys     0m0.940s

Сравнение основного цикличного выполнения проносится, не вызывая wc процессы, шоу, что цикличное выполнение тире почти в 6 раз быстрее!

$ time bash -c 'for i in *; do echo "$i">/dev/null; done'
real    0m1.715s
user    0m1.459s
sys     0m0.252s



$ time dash -c 'for i in *; do echo "$i">/dev/null; done'
real    0m0.375s
user    0m0.169s
sys     0m0.203s

Цикличное выполнение является все еще относительно медленным в любой оболочке, как продемонстрировано ранее, таким образом, для масштабируемости мы должны попытаться использовать более функциональные методы, таким образом, повторение выполняется в скомпилированных процессах.

$ time find -type f -print0 | wc -l --files0-from=- | tail -n1
    30000 total
real    0m0.299s
user    0m0.072s
sys     0m0.221s

Вышеупомянутое является безусловно наиболее эффективным решением и иллюстрирует тезис хорошо, что нужно сделать как можно меньше в сценарии оболочки и цели только для использования его для соединения существующей логики, доступной в богатом наборе утилит, доступных в системе UNIX.

Украденный От Общего сценария оболочки путает Pádraig Brady.

2
27.01.2020, 19:59
  • 1
    универсальное правило: дескриптор файла, обрабатывающий также, стоит, поэтому уменьшите их количество. Вместо for i in *; do wc -l "$i">/dev/null; done лучше сделайте for i in *; do wc -l "$i"; done>/dev/null. –  manatwork 07.03.2013, 09:29
  • 2
    @manatwork, из которого он также аннулирует вывод time cmd –  Rahul Patil 07.03.2013, 10:03
  • 3
    @manatwork, Хороший... теперь также, дает мне вывод без вызова wc -l, проверьте, что я обновил в сообщении Ваш вывод –  Rahul Patil 07.03.2013, 10:20
  • 4
    Ну, предыдущие измерения были сделаны на меньшем каталоге. Теперь я создал один с 30 000 файлов и повторил тесты: pastebin.com/pCV6QKp2 –  manatwork 07.03.2013, 11:20
  • 5
    Тем сравнительным тестам не удается допускать различное время начала каждой оболочки. Сравнительные тесты, сделанные из каждой оболочки, были бы лучше. –  agc 01.01.2017, 19:33

Теги

Похожие вопросы