Задался вопросом какая же все-таки оболочка быстрее? У меня на серверах можно встретить такой зоопарк: sh, bash, ksh, mksh, posh, zsh. Почему так много? Не знаю, сервера достались по наследству, видимо остатки от давно сгинувших девопсов по реке Стикс.



На своей локальной машине использую исключительно zsh со всякими наворотами:



🐱 Oh My Zsh - прибомбасина для zsh

🐱 autosuggestions - автокомплит



На серверах алогично Oh My Zsh + autosuggestions ну и нативный bash для скриптов, все остальное — неведомая хрень.



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



Дополнительно из плагинов включаю 🐱 zsh-syntax-highlighting чтобы красивенько было. Ну а чтобы каждый раз не указывать ssh ключи при подключении к серверам, использую встроенный плагин ssh-agent.



plugins=(git zsh-syntax-highlighting zsh-autosuggestions ssh-agent)

zstyle :omz:plugins:ssh-agent agent-forwarding on

zstyle :omz:plugins:ssh-agent identities home_rsa work_rsa2 her_rsa3

zstyle :omz:plugins:ssh-agent lifetime



Вернемся в теме - кто быстрее. Очевидно же что bash! Давай убедимся.



Запустим этот скрипт в bash:



for i in $(seq 1 1000);

do bash -c ":" ;

done



Запускаем через time: time bash speed.sh



time - оценивает по времени производительность любой задачи, выводя после её завершения затраченное время: реальное, пользователя и системы. Через time можешь оценивать производительность по времени любых своих скриптов.



После запуска получаю: 0m1.242s



Скрипт отслеживает точное время открытия шелла 1000 раз без выполнения каких-либо операций.



Ок, теперь давай запустим этот скрипт в zsh: time zsh speed.sh



Результат: 0m1.344s



Не такие и большие различия. Даже можно сказать ничтожные. Но это всего лишь один тест. Чтобы получить какие-то средние значения воспользуемся утилитой:



🐱 shellbench



Устанавливаем
и запускаем:



git clone https://github.com/shellspec/shellbench.git .

shellbench -s bash,zsh sample/*



По итогу получаем около 28ми тестов. На картинке можешь глянуть мои результаты. Числа в таблице это - количество выполнений в секунду.



Хм, в совокупности тестов получается что zsh где-то прям намного шустрее, да даже ни где-то, а прям почти лидирует в производительности.



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



Вывод: По результатам тестов, zsh оказался быстрее чем bash, но не везде. Опять-же тут все индивидуально.



Кстати когда запускаешь на macos midnight commander + zsh в роле оболочки, то mc запускается прям кое как, секунды три наверное. Поэтому с mc я использую bash, можно конечно этот момент отдебажить, но мне лень. Если когда-нибудь руки дойдут, напишу как пофиксил.



А вообще самая быстрая оболочка это Dash (Debian Almquist Shell). Это POSIX-совместимая реализация Bourne Shell. Она заменяет /bin/sh в скриптах по умолчанию и обеспечивает улучшенную скорость, потребляя при этом меньше ресурсов. Dash превосходит bash/zsh по производительности, но его нельзя использовать, так как он не предназначен для взаимодействия.



А какую оболочку используешь ты и почему?



Кстати всем привет! Надеюсь твои выходные прошли без проишествий. Увидимся!



tags:
#linux #utils



💩 @bashdays