KABUK DİZİ:
Muhtemelen bir kabuğun performansını ölçmek için yararlı bir araç, tekrarlayan çok küçük, basit değerlendirmeler yapmaktır. Bir döngü okumak gerekiyor, çünkü sadece döngü değil, aynı zamanda girdi üzerinden döngü önemlidir <&0
.
Bunun, daha önce bir kabuk işleminin ne kadar hızlı bir şekilde yüklendiğini gösteren bir kabuk işleminin performansını gösterdiği için zaten yayınlanan , @cuonglm testlerini tamamlayacağını düşündüm . Bu sayede aramızdaki madalyonun iki tarafını da kapsıyoruz.
İşte gösteriyi kolaylaştıran bir işlev:
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
Ya yeni satır başına okuma başına bir değişkeni arttırır ya da eğer yapabiliyorsa, yeni satır başına okuma başına 50 katı arttırır. Değişken her artırıldığında, basılır stdout
. Bir çeşit seq
haç gibi davranıyor nl
.
Ve sadece ne yaptığını açıkça belirtmek için - işte yukarıdaki fonksiyona set -x;
hemen önce yerleştirdikten sonra kesilmiş bir çıktı time
:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
Böylece her kabuk önce şöyle denir:
env - $shell -c "while echo; do echo; done |..."
... içeri 3<<\SCRIPT
- ya da ne zaman cat
, ne zaman okursa tekrar yazması gereken girişi oluşturmak için . Ve bunun diğer tarafında |pipe
kendini tekrar şöyle çağırıyor:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Böylece ilk çağrıdan yana env
(çünkü cat
aslında önceki satırda denir) ; çağrıldığı andan çıkana kadar başka hiçbir işlem başlatılmaz. En azından, umarım bu doğrudur.
Rakamlardan önce ...
Taşınabilirlik hakkında bazı notlar almalıyım.
posh
beğenmez $((n=n+1))
ve ısrar eder$((n=$n+1))
mksh
printf
Çoğu durumda bir yerleşik yok . Daha önceki testlerde çok fazla gecikme yaşandı - /usr/bin/printf
her koşuya neden oldu. Dolayısıyla echo -n
yukarıdaki.
belki hatırladığım kadarıyla ...
Neyse, rakamlara:
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
Bu hepsini tek seferde alacak.
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 = MAYBE TAMAM.
Yine de, bu oldukça rastgele bir testtir, ancak okuma girdisini, aritmetik değerlendirmeyi ve değişken genişlemeyi test eder. Belki kapsamlı değil, ama muhtemelen oraya yakın.
Teresa e Junior'dan EDIT : @mikeserv ve ben birçok test yaptık (ayrıntılar için sohbetimize bakın) ve sonuçların şöyle özetlenebileceğini gördük:
- Hıza ihtiyacınız varsa, kesinlikle tire ile gidin , diğer tüm kabuklardan çok daha hızlı ve bash değerinden yaklaşık 4x daha hızlıdır .
- İken busybox 'ın kabuk çok daha yavaş olabilir çizgi kendi userland araçlardan birçok çünkü bazı testlerde o kadar hızlı olabilir gibi
grep
, sed
, sort
vb yaygın olarak kullanılan GNU kadar birçok özellik bizde olmayan yarar, ancak işi bu kadar halledebilir.
- Hız, değer verdiğiniz her şey değilse, ksh (veya ksh93 ), hız ve özellikler arasında en iyi yöntem olarak kabul edilebilir. Bu hız küçük karşılaştırmasını mksh çok daha hızlıdır, bash ve benzerleri de bazı benzersiz özelliklere sahip kayar nokta aritmetik .
- Her ne kadar bash basitliği, istikrarı ve işlevselliği ile ünlü olsa da, testlerimizin çoğunda ve büyük bir farkla tüm kabukların en yavaşıydı.