Циклы оболочки медленные, а bash самые медленные. Снаряды не предназначены для тяжелой работы в петлях. Оболочки предназначены для запуска нескольких внешних оптимизированных процессов в пакетах данных.
В любом случае, мне было любопытно, как сравниваются циклы оболочки, поэтому я сделал небольшой тест:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Подробности:
- Процессор: Intel® Core ™ TM Процессор M530 с тактовой частотой 2,27 ГГц
- ksh: версия sh (AT & T Research) 93u + 2012-08-01
- bash: GNU bash, версия 4.3.11 (1) -релиз (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-unknown-linux-gnu)
- тире: 0.5.7-4ubuntu1
)
(Сокращенные) результаты (время на итерацию):
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
Из результатов:
Если вам нужен немного более быстрый цикл оболочки, то если у вас есть [[
синтаксис и вы хотите быстрый цикл оболочки, вы находитесь в расширенной оболочке и у вас также есть цикл C-like for. Тогда используйте C как для цикла. Они могут быть примерно в 2 раза быстрее, чем while [
-loops в одной и той же оболочке.
- У ksh самый быстрый
for (
цикл - около 2,7 мкс за итерацию
- У dash самый быстрый
while [
цикл - около 5,8 мкс за итерацию
C для циклов может быть на 3-4 десятичных порядка быстрее. (Я слышал, что Торвальдс любит C).
Оптимизированный цикл C for в 56500 раз быстрее, чем while [
цикл bash (самый медленный цикл оболочки), и в 6750 раз быстрее, чем for (
цикл ksh (самый быстрый цикл оболочки).
Опять же, медлительность оболочек не должна иметь большого значения, потому что типичная схема с оболочками - это разгрузка нескольких процессов внешних оптимизированных программ.
С этим шаблоном оболочки часто упрощают написание сценариев с производительностью, превосходящей сценарии Python (в прошлый раз, когда я проверял, создание конвейеров процессов в python было довольно неуклюжим).
Еще одна вещь, чтобы рассмотреть это время запуска.
time python3 -c ' '
занимает от 30 до 40 мс на моем ПК, тогда как оболочка занимает около 3 мс Если вы запускаете много скриптов, это быстро складывается, и вы можете очень много сделать за дополнительные 27-37 мс, которые питон берет, чтобы начать. Небольшие сценарии могут быть завершены несколько раз за этот период времени.
(NodeJs, вероятно, является худшей средой выполнения сценариев в этом отделе, поскольку для ее запуска требуется около 100 мс (хотя после ее запуска вам будет сложно найти лучшего исполнителя среди языков сценариев)).