SEQ SHELL:
Prawdopodobnie przydatnym sposobem oceny wydajności powłoki jest powtarzalne powtarzanie wielu bardzo małych, prostych ocen. Myślę, że ważne jest, aby nie tylko zapętlić, ale także zapętlić dane wejściowe , ponieważ powłoka musi czytać <&0
.
Myślałem, że uzupełni to testy już opublikowane @cuonglm, ponieważ pokazuje wydajność pojedynczego procesu powłoki po jej wywołaniu, w przeciwieństwie do tego, który pokazuje, jak szybko ładuje się proces powłoki po wywołaniu. W ten sposób między nami pokrywamy obie strony monety.
Oto funkcja ułatwiająca pokaz:
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
Inkrementuje zmienną raz na odczyt nowego wiersza lub, w miarę możliwości, zwiększa 50 razy na odczyt nowego wiersza. Za każdym razem, gdy zmienna jest zwiększana, jest drukowana do stdout
. Zachowuje się jak seq
krzyż nl
.
I żeby wyjaśnić, co robi - oto niektóre skrócone set -x;
dane wyjściowe po wstawieniu go tuż przed time
powyższą funkcją:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
Tak więc każda powłoka jest najpierw nazywana:
env - $shell -c "while echo; do echo; done |..."
... aby wygenerować dane wejściowe, które będą musiały być zapętlone, gdy wczyta się 3<<\SCRIPT
- lub kiedy to cat
zrobi. Z drugiej strony |pipe
nazywa się ponownie:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Poza początkowym wywołaniem do env
(ponieważ cat
tak naprawdę jest wywoływane w poprzedniej linii) ; żadne inne procesy nie są wywoływane od momentu jego wywołania do momentu wyjścia. Przynajmniej mam nadzieję, że to prawda.
Przed liczbami ...
Powinienem zrobić kilka notatek na temat przenośności.
posh
nie lubi $((n=n+1))
i nalega na$((n=$n+1))
mksh
printf
w większości przypadków nie ma wbudowanego. Wcześniejsze testy znacznie go opóźniały - wywoływały /usr/bin/printf
każdy bieg. Stąd echo -n
powyższe.
może bardziej, jak pamiętam ...
W każdym razie do liczb:
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
Wszystko to za jednym razem ...
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
ARBITRARY = MOŻE BYĆ OK?
Jest to jednak raczej arbitralny test, ale testuje on odczyt danych, ocenę arytmetyczną i rozszerzanie zmiennych. Może nie wyczerpujące, ale być może blisko.
EDIT autorstwa Teresy e Junior : @mikeserv i ja przeprowadziliśmy wiele innych testów (szczegóły na naszym czacie ) i stwierdziliśmy, że wyniki można podsumować w następujący sposób:
- Jeśli potrzebujesz prędkości, zdecydowanie skorzystaj z myślnika , jest ona znacznie szybsza niż jakakolwiek inna powłoka i około 4x szybsza niż uderzenie .
- Choć BusyBox powłoki „s może być znacznie wolniejszy niż desce rozdzielczej , w niektórych testów może być szybciej, ponieważ ma wiele własnych narzędzi przestrzeni użytkownika, jak
grep
, sed
, sort
, itd., Które nie mają za wiele funkcji, jak powszechnie stosowanych GNU narzędzia, ale mogą zrobić tyle samo.
- Jeśli prędkość to nie wszystko, na czym ci zależy, ksh (lub ksh93 ) można uznać za najlepszy kompromis między szybkością a funkcjami. Jego prędkość porównuje się z mniejszym mksh , który jest znacznie szybszy niż bash , a także ma kilka unikalnych cech, takich jak arytmetyka zmiennoprzecinkowa .
- Chociaż bash słynie z prostoty, stabilności i funkcjonalności, był to najwolniejszy ze wszystkich powłok w większości naszych testów i z dużym marginesem.