Мне было интересно , что это самый быстрый способ запустить сценарий, я читал , что есть разница в скорости между отображением вывода скрипта на терминале, перенаправив его в файл или возможно /dev/null
.
Поэтому, если вывод не важен, какой самый быстрый способ заставить скрипт работать быстрее, даже если он минимален.
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Ответы:
В наши дни терминалы работают медленнее, чем раньше, в основном из-за того, что видеокарты больше не заботятся о 2D-ускорении. Таким образом, печать на терминале может замедлить работу сценария, особенно когда используется прокрутка.
Следовательно
./script.sh
, медленнее, чем./script.sh >script.log
, что, в свою очередь, медленнее, чем/script.sh >/dev/null
, потому что последние требуют меньше работы. Однако то, насколько это существенно для какой-либо практической цели, зависит от того, сколько выдает ваш скрипт и как быстро. Если ваш сценарий записывает 3 строки и завершается, или если он печатает 3 страницы каждые несколько часов, вам, вероятно, не нужно беспокоиться о перенаправлениях.Изменить: Некоторые быстрые (и полностью сломанные) тесты:
В консоли Linux, 240x75:
В
xterm
, 260х78:Перенаправление в файл на диске Samsung SSD 850 PRO 512 ГБ:
Перенаправить на
/dev/null
:источник
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
печатает 100000+ строк в одну секунду на моем MBP.)xterm
на HP Apollo 30 лет назад ползли по сравнению сxterms
HP-UX 20 лет назад. Однако консоль Linux с видеокартой Matrox 15 лет назад работала медленнее, чем та же консоль Linux с картой S3 20 лет назад. А консоль Linux с кадровым буфером высокого разрешения на современной карте просто непригодна. :)Я бы инстинктивно согласился с ответом Сато Кацуры; это имеет смысл. Тем не менее, это достаточно легко проверить.
Я протестировал запись миллиона строк на экран, запись (добавление) в файл и перенаправление на
/dev/null
. Я проверил каждый из них по очереди, а затем сделал пять копий. Это команды, которые я использовал.Затем я составил график общего времени ниже.
Как вы можете видеть, предположения Сате Кацуры были правильными. Что касается ответа Satō Katsura, я также сомневаюсь, что ограничивающим фактором будет выход, поэтому маловероятно, что выбор вывода окажет существенное влияние на общую скорость сценария.
FWIW, мой оригинальный ответ содержал другой код, в котором файл добавлялся и
/dev/null
перенаправлялся внутри цикла.Как отмечает Джон Кугельман в комментариях, это добавляет много накладных расходов. Как стоит вопрос о том , что это на самом деле не правильный путь , чтобы проверить это, но я оставлю это здесь , как это ясно показывает стоимость повторного открытия файла несколько раз из внутри самого сценария.
В этом случае результаты меняются местами.
источник
xterm
в 3 раза медленнее, чем/dev/null
.Другой способ ускорить работу скрипта - использовать более быстрый интерпретатор оболочки. Сравните скорости занятого цикла POSIX , работающего под
bash
v4.4 ,ksh
v93u + 20120801 иdash
v0.5.8 .bash
:Выход:
ksh
:Выход:
dash
:Выход:
Подмножество команд в
bash
иksh
является обратно совместимым с всеми команд вdash
.bash
Скрипт , который использует только команды в этой подгруппе должен работать сdash
.Некоторые
bash
сценарии, использующие новые функции, могут быть преобразованы в другой интерпретатор. Еслиbash
сценарий в значительной степени опирается на новые функции, это может не стоить беспокоиться - некоторые новыеbash
функции представляют собой улучшения, которые как легче кодировать, так и более эффективны (несмотря наbash
то, что они обычно медленнее), так чтоdash
эквивалентны (что может включать запуск несколько других команд), будет медленнее.Если есть сомнения, запустите тест ...
источник