SHELL SEQ:
Wahrscheinlich ist es ein nützliches Mittel, die Leistung einer Shell zu messen, sehr kleine, einfache Auswertungen, die wiederholt durchgeführt werden. Ich denke, es ist wichtig, nicht nur eine Schleife auszuführen, sondern eine Schleife über die Eingabe auszuführen , da eine Shell lesen muss <&0
.
Ich dachte, dies würde die bereits veröffentlichten Tests von @cuonglm ergänzen , da es die Leistung eines einzelnen Shell-Prozesses zeigt, wenn er einmal aufgerufen wurde, im Gegensatz zu seinem, der zeigt, wie schnell ein Shell-Prozess geladen wird, wenn er aufgerufen wird. Auf diese Weise decken wir beide Seiten der Medaille ab.
Hier ist eine Funktion, um die Demo zu erleichtern:
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
Es erhöht eine Variable entweder einmal pro Zeilenumbruch oder, als leichte Optimierung, um das 50-fache pro Zeilenumbruch. Jedes Mal, wenn die Variable inkrementiert wird, wird auf gedruckt stdout
. Es verhält sich wie eine Art seq
Kreuz nl
.
Und um ganz klar zu machen, was es tut - hier ist eine abgeschnittene set -x;
Ausgabe, nachdem Sie sie direkt zuvor time
in die obige Funktion eingefügt haben:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
So heißt jede Shell zuerst:
env - $shell -c "while echo; do echo; done |..."
... um die Eingabe zu generieren, die beim Einlesen durchlaufen werden muss 3<<\SCRIPT
- oder cat
zumindest wann . Und andererseits |pipe
nennt es sich wieder so:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Also abgesehen von dem ersten Aufruf an env
(weil cat
in der vorherigen Zeile tatsächlich aufgerufen wird) ; Vom Zeitpunkt des Aufrufs bis zum Beenden werden keine anderen Prozesse aufgerufen. Zumindest hoffe ich, dass das stimmt.
Vor den Zahlen ...
Ich sollte ein paar Anmerkungen zur Portabilität machen.
posh
mag nicht $((n=n+1))
und besteht darauf$((n=$n+1))
mksh
hat printf
in den meisten Fällen kein eingebautes. Frühere Tests hatten viel Nachholbedarf - es wurde /usr/bin/printf
für jeden Lauf aufgerufen . Daher das echo -n
Obige.
vielleicht mehr, als ich mich erinnere ...
Sowieso zu den Zahlen:
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
Das bringt sie alle auf einen Streich ...
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 = MÖGLICHERWEISE OK?
Dies ist immer noch ein eher willkürlicher Test, der jedoch Leseeingaben, arithmetische Auswertungen und Variablenerweiterungen testet. Vielleicht nicht umfassend, aber möglicherweise in der Nähe von dort.
EDIT von Teresa e Junior : @mikeserv und ich haben viele andere Tests durchgeführt ( Einzelheiten finden Sie in unserem Chat ), und wir haben festgestellt, dass die Ergebnisse folgendermaßen zusammengefasst werden können:
- Wenn Sie Geschwindigkeit brauchen, gehen Sie auf jeden Fall mit Dash , es ist viel schneller als jede andere Shell und etwa 4x schneller als Bash .
- Während Busybox ‚s Schale viel langsamer als sein Strich , in einigen Tests könnte es schneller sein, weil sie viele ihrer eigenen Benutzerprogramme hat, wie
grep
, sed
, sort
usw., die als die üblicherweise verwendeten GNU nicht so viele Funktionen haben Dienstprogramme, aber kann die Arbeit so viel erledigen.
- Wenn Geschwindigkeit nicht alles ist, was Sie interessiert, kann ksh (oder ksh93 ) als der beste Kompromiss zwischen Geschwindigkeit und Funktionen angesehen werden. Die Geschwindigkeit ist vergleichbar mit dem kleineren mksh , das viel schneller als bash ist , und es hat auch einige einzigartige Funktionen, wie z . B. Fließkomma-Arithmetik .
- Obwohl bash für seine Einfachheit, Stabilität und Funktionalität bekannt ist, war es bei den meisten Tests die langsamste aller Shells und das mit großem Abstand.