SHELL SEQ:
Mungkin cara yang berguna untuk menilai kinerja sebuah shell adalah dengan melakukan banyak evaluasi kecil yang sangat sederhana secara berulang-ulang. Penting, saya pikir, tidak hanya untuk mengulang, tetapi untuk mengulang masukan , karena shell perlu membaca <&0
.
Saya pikir ini akan melengkapi tes @ cuonglm yang sudah diposting karena itu menunjukkan kinerja proses shell tunggal sekali dipanggil, sebagai lawannya yang menunjukkan seberapa cepat proses shell dimuat ketika dipanggil. Dengan cara ini, di antara kami, kami menutupi kedua sisi mata uang.
Inilah fungsi untuk memfasilitasi demo:
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
Entah itu menambah variabel satu kali per baris membaca baru atau, sebagai sedikit optimasi, jika bisa, itu meningkat 50 kali per baris membaca baru. Setiap kali variabel bertambah itu dicetak ke stdout
. Berperilaku seperti semacam seq
salib nl
.
Dan hanya untuk membuatnya sangat jelas apa yang dilakukannya - inilah beberapa set -x;
keluaran yang terpotong setelah memasukkannya tepat time
pada fungsi di atas:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
Jadi setiap shell pertama kali disebut seperti:
env - $shell -c "while echo; do echo; done |..."
... untuk menghasilkan input yang diperlukan untuk mengulang ketika dibaca 3<<\SCRIPT
- atau kapan cat
, bagaimanapun. Dan di sisi lain |pipe
itu menyebut dirinya lagi seperti:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Jadi selain dari panggilan awal ke env
(karena cat
sebenarnya dipanggil di baris sebelumnya) ; tidak ada proses lain yang dipanggil sejak dipanggil sampai keluar. Setidaknya, saya harap itu benar.
Sebelum angka ...
Saya harus membuat beberapa catatan tentang portabilitas.
posh
tidak suka $((n=n+1))
dan bersikeras$((n=$n+1))
mksh
tidak memiliki printf
builtin dalam banyak kasus. Tes sebelumnya membuatnya tertinggal banyak - itu memohon /usr/bin/printf
untuk setiap lari. Karena itu di echo -n
atas.
mungkin lebih seperti yang saya ingat ...
Pokoknya, ke nomor:
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
Itu akan membuat mereka semua sekaligus ...
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
ARBITRARI = MUNGKIN OK?
Namun, ini adalah tes yang agak sewenang-wenang, tetapi tes input membaca, evaluasi aritmatika, dan ekspansi variabel. Mungkin tidak komprehensif, tetapi mungkin dekat dengan sana.
EDIT oleh Teresa e Junior : @mikeserv dan saya telah melakukan banyak tes lain (lihat detail obrolan kami ), dan kami menemukan hasilnya dapat diringkas seperti ini:
- Jika Anda membutuhkan kecepatan, gunakan dash , pasti jauh lebih cepat daripada shell lain dan sekitar 4x lebih cepat dari bash .
- Sementara busybox shell 's bisa jauh lebih lambat dari dasbor , di beberapa tes itu bisa lebih cepat, karena memiliki banyak utilitas sendiri userland, seperti
grep
, sed
, sort
, dll, yang tidak memiliki banyak fitur seperti GNU yang umum digunakan utilitas, tetapi bisa menyelesaikan pekerjaan sebanyak mungkin.
- Jika kecepatan bukanlah segalanya yang Anda pedulikan, ksh (atau ksh93 ) dapat dianggap sebagai kompromi terbaik antara kecepatan dan fitur. Kecepatannya dibandingkan dengan mksh yang lebih kecil , yang jauh lebih cepat daripada bash , dan juga memiliki beberapa fitur unik, seperti aritmatika floating point .
- Meskipun bash terkenal dengan kesederhanaan, stabilitas, dan fungsionalitasnya, bash adalah yang paling lambat dari semua cangkang di sebagian besar pengujian kami, dan dengan margin yang besar.