SHELL SEQ:
Probablemente, un medio útil para evaluar el rendimiento de un proyectil es realizar muchas evaluaciones simples y muy pequeñas de forma repetitiva. Creo que es importante no solo hacer un bucle, sino hacer un bucle sobre la entrada , porque un shell necesita leer <&0
.
Pensé que esto complementaría las pruebas que @cuonglm ya publicó porque demuestra el rendimiento de un solo proceso de shell una vez invocado, a diferencia del suyo, lo que demuestra la rapidez con la que se carga un proceso de shell cuando se invoca. De esta manera, entre nosotros, cubrimos ambas caras de la moneda.
Aquí hay una función para facilitar la demostración:
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
Incrementa una variable una vez por lectura de nueva línea o, como una ligera optimización, si puede, aumenta 50 veces por lectura de nueva línea. Cada vez que se incrementa la variable se imprime en stdout
. Se comporta mucho como una especie de seq
cruz nl
.
Y solo para dejar muy claro lo que hace: aquí hay un set -x;
resultado truncado después de insertarlo justo antes time
en la función anterior:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
Entonces cada shell se llama primero como:
env - $shell -c "while echo; do echo; done |..."
... para generar la entrada que necesitará recorrer cuando se lea 3<<\SCRIPT
, o cuando lo cat
haga, de todos modos. Y, por otro lado, se |pipe
vuelve a llamar a sí mismo como:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Entonces, aparte de la llamada inicial a env
(porque en cat
realidad se llama en la línea anterior) ; no se invocan otros procesos desde el momento en que se llama hasta que sale. Al menos, espero que sea cierto.
Antes de los números ...
Debo tomar algunas notas sobre la portabilidad.
posh
no le gusta $((n=n+1))
e insiste en$((n=$n+1))
mksh
no tiene un printf
incorporado en la mayoría de los casos. Las pruebas anteriores lo retrasaron mucho: invocaba /usr/bin/printf
para cada carrera. De ahí lo echo -n
anterior.
tal vez más como lo recuerdo ...
De todos modos, a los números:
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
Eso los conseguirá de una vez ...
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
ARBITRARIO = QUIZÁS OK?
Aún así, esta es una prueba bastante arbitraria, pero prueba la entrada de lectura, la evaluación aritmética y la expansión variable. Quizás no comprensivo, pero posiblemente cerca de allí
EDITAR por Teresa e Junior : @mikeserv y yo hemos realizado muchas otras pruebas (vea nuestro chat para más detalles), y encontramos que los resultados podrían resumirse así:
- Si necesita velocidad, vaya definitivamente con dash , es mucho más rápido que cualquier otro shell y aproximadamente 4 veces más rápido que bash .
- Mientras busybox shell 's puede ser mucho más lento que el tablero , en algunas pruebas de que podría ser más rápido, ya que tiene muchas de sus propias herramientas de usuario, como
grep
, sed
, sort
, etc., que no tienen tantas características como el uso general de GNU utilidades, pero puede hacer el trabajo tanto.
- Si la velocidad no es todo lo que le interesa, ksh (o ksh93 ) puede considerarse el mejor compromiso entre velocidad y características. Su velocidad se compara con la mksh más pequeña , que es mucho más rápida que bash , y también tiene algunas características únicas, como la aritmética de coma flotante .
- Aunque bash es famoso por su simplicidad, estabilidad y funcionalidad, fue el más lento de todos los proyectiles en la mayoría de nuestras pruebas, y por un amplio margen.