Как переместить / var / log на другой диск?

Циклы оболочки медленные, а цикл 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 (R) Core (TM) i5 CPU M 430 @ 2,27 ГГц
  • ksh: версия sh (исследования AT&T) 93u + 2012-08-01
  • bash: GNU bash, версия 4.3.11 (1) -release (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

Из результатов:

Если вам нужен немного более быстрый цикл оболочки, то если у вас есть синтаксис [[] и вам нужен быстрый цикл оболочки, вы работаете в расширенной оболочке, и у вас также есть цикл for в стиле Си. Тогда используйте цикл C как for. Они могут быть примерно в 2 раза быстрее, чем , в то время как [ -циклы в той же оболочке.

  • ksh имеет самый быстрый цикл for ( примерно 2,7 мкс на итерацию
  • тире имеет самый быстрый цикл while [] примерно 5,8 мкс на итерацию

Циклы C for могут быть на 3-4 порядка десятичной величины быстрее (я слышал, что Торвальдс любит C).

Оптимизированный цикл C for в 56500 раз быстрее чем цикл bash while [ (самый медленный цикл оболочки) и в 6750 раз быстрее, чем цикл ksh for ( (самый быстрый цикл оболочки).


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

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

Еще одна вещь, которую следует учитывать, - это время запуска.

time python3 -c ' '

на моем ПК занимает от 30 до 40 мс, тогда как оболочка занимает около 3 мс. Если вы запускаете много скриптов, это быстро накапливается, и вы можете сделать очень много за дополнительные 27–37 мсек, которые требуется python только для запуска. Небольшие скрипты можно закончить несколько раз за это время.

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

3
04.07.2016, 16:17
0 ответов

Теги

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