ПОШУКОВИЙ ШЕК:
Напевно, корисним засобом тестування оболонки на стенді є те, щоб робити багато дуже маленьких, простих оцінок повторно. Думаю, важливо не просто циклічно, а перетворити цикл на вхід , оскільки оболонку потрібно читати <&0
.
Я думав, що це доповнить уже опубліковані тести @cuonglm, оскільки він демонструє ефективність одного процесу оболонки після виклику, на відміну від його, який демонструє, як швидко завантажується процес оболонки при виклику. Таким чином між нами прикриваємо обидві сторони монети.
Ось функція полегшення демонстрації:
sh_bench() ( #dont copy+paste comments
o=-c sh=$(command -v "$1") ; shift #get shell $PATH; toss $1
[ -z "${sh##*busybox}" ] && o='ash -c' #cause its weird
set -- "$sh" $o "'$(cat <&3)'" -- "$@" #$@ = invoke $shell
time env - "$sh" $o "while echo; do echo; done|$*" #time (env - sh|sh) AC/DC
) 3<<-\SCRIPT
#Everything from here down is run by the different shells
i="${2:-1}" l="${1:-100}" d="${3:-
}"; set -- "\$((n=\$n\${n:++\$i}))\$d" #prep loop; prep eval
set -- $1$1$1$1$1$1$1$1$1$1 #yup
while read m #iterate on input
do [ $(($i*50+${n:=-$i})) -gt "$(($l-$i))" ] || #eval ok?
eval echo -n \""$1$1$1$1$1"\" #yay!
[ $((n=$i+$n)) -gt "$(($l-$i))" ] && #end game?
echo "$n" && exit #and EXIT
echo -n "$n$d" #damn - maybe next time
done #done
#END
SCRIPT #end heredoc
Він або збільшує змінну один раз за читання нового рядка, або, як невелика оптимізація, якщо це можливо, збільшується 50 разів за прочитане нове рядко. Кожен раз, коли змінна збільшується, вона надрукується stdout
. Він дуже поводиться, як свого роду seq
хрест nl
.
І тільки для того, щоб було дуже зрозуміло, що це робить - ось деякий усічений set -x;
результат після його вставлення безпосередньо перед time
функцією:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
Отже, кожна оболонка спочатку називається так:
env - $shell -c "while echo; do echo; done |..."
... щоб генерувати вхід, який йому знадобиться переосмислити, коли він читається в 3<<\SCRIPT
- або коли cat
це все одно. А з іншого боку, |pipe
він знову називає себе так:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Тож осторонь від початкового виклику до env
(тому що cat
насправді викликається у попередньому рядку) ; ніякі інші процеси не викликаються з часу виклику до моменту його виходу. Принаймні, я сподіваюся, що це правда.
Перед цифрами ...
Я повинен зробити деякі зауваження щодо портативності.
posh
не подобається $((n=n+1))
і наполягає на цьому$((n=$n+1))
mksh
не має printf
вбудованого в більшості випадків. На попередніх тестах це значно відставало - це викликало /usr/bin/printf
кожен пробіг. Звідси echo -n
викладене.
можливо більше, як я його пам’ятаю ...
У будь-якому випадку, до цифр:
for sh in dash busybox posh ksh mksh zsh bash
do sh_bench $sh 20 5 $sh 2>/dev/null
sh_bench $sh 500000 | wc -l
echo ; done
Це отримає їх за один раз ...
0dash5dash10dash15dash20
real 0m0.909s
user 0m0.897s
sys 0m0.070s
500001
0busybox5busybox10busybox15busybox20
real 0m1.809s
user 0m1.787s
sys 0m0.107s
500001
0posh5posh10posh15posh20
real 0m2.010s
user 0m2.060s
sys 0m0.067s
500001
0ksh5ksh10ksh15ksh20
real 0m2.019s
user 0m1.970s
sys 0m0.047s
500001
0mksh5mksh10mksh15mksh20
real 0m2.287s
user 0m2.340s
sys 0m0.073s
500001
0zsh5zsh10zsh15zsh20
real 0m2.648s
user 0m2.223s
sys 0m0.423s
500001
0bash5bash10bash15bash20
real 0m3.966s
user 0m3.907s
sys 0m0.213s
500001
АРБИТРАР = МОЖЕ ОК?
Все-таки це досить довільний тест, але він робить тестові введення читання, арифметичну оцінку та змінне розширення. Можливо, не всеохоплюючий, але, можливо, поруч з ним.
EDIT від Teresa e Junior : @mikeserv і я зробили багато інших тестів (детальніше див. Наш чат ), і ми виявили, що результати можна підсумувати так:
- Якщо вам потрібна швидкість, обов'язково рухайтеся з тире , це набагато швидше, ніж будь-яка інша оболонка і приблизно в 4 рази швидше, ніж удар .
- У той час як BusyBox оболонка «s може бути набагато повільніше , ніж тир , в деяких тестах він може бути швидше, тому що він володіє багатьма зі своїх власних користувальницьких утиліт, як
grep
, sed
, sort
і т.д., які не має стількох можливостей , як правило , використовуються GNU комунальні послуги, але можна зробити роботу якнайбільше.
- Якщо швидкість - це не все, що вам дуже важливо, ksh (або ksh93 ) можна вважати найкращим компромісом між швидкістю та можливостями. Його швидкість порівнюється з меншим мкш , який швидше, ніж bash , і він також має деякі унікальні особливості, наприклад, арифметика з плаваючою комою .
- Хоча баш славиться своєю простотою, стабільністю та функціональністю, він був найбільш повільним з усіх оболонок у більшості наших тестів та великим запасом.