शेल SEQ:
संभवतः शेल के प्रदर्शन को चिह्नित करने वाले बेंच-मार्क का एक उपयोगी साधन बहुत छोटे, सरल मूल्यांकनों का दोहराव करना है। यह महत्वपूर्ण है, मुझे लगता है, न केवल लूप पर, बल्कि इनपुट पर लूप करने के लिए , क्योंकि एक शेल को पढ़ने की जरूरत है <&0
।
मैंने सोचा कि यह पहले से ही पोस्ट किए गए परीक्षणों के पूरक होगा @ क्योंकि यह एक बार शेल प्रक्रिया के प्रदर्शन का प्रदर्शन करता है, एक बार आह्वान किए जाने के विपरीत, जो यह दर्शाता है कि आह्वान किए जाने पर शेल प्रक्रिया लोड कितनी जल्दी होती है। इस तरह, हमारे बीच, हम सिक्के के दोनों किनारों को कवर करते हैं।
यहाँ डेमो की सुविधा के लिए एक समारोह है:
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
यह या तो न्यूलाइन पढ़े जाने के बाद या थोड़ी-अनुकूलन के रूप में एक वेरिएबल को बढ़ाता है, यदि यह हो सकता है, तो यह प्रति बार पढ़ी गई नई लाइन के अनुसार 50 गुना बढ़ाता है। हर बार चर बढ़ने पर इसे मुद्रित किया जाता है stdout
। यह एक तरह के seq
क्रॉस की तरह व्यवहार करता है nl
।
और बस यह स्पष्ट करने के लिए कि यह क्या करता है - यहां ऊपर दिए गए फ़ंक्शन में कुछ set -x;
सम्मिलित करने के बाद यहां कुछ छोटा आउटपुट दिया time
गया है:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
इसलिए प्रत्येक खोल को पहले कहा जाता है:
env - $shell -c "while echo; do echo; done |..."
... उस इनपुट को जेनरेट करने के लिए जब उसमें 3<<\SCRIPT
- या जब cat
भी पढ़ता है, तब उसे लूप करना होगा । और इसके दूसरी तरफ |pipe
यह खुद को फिर से कॉल करता है जैसे:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
इसलिए प्रारंभिक कॉल से अलग env
(क्योंकि cat
वास्तव में पिछली पंक्ति में कहा जाता है) ; जब तक इसे बाहर नहीं निकाला जाता है, तब तक किसी अन्य प्रक्रिया को लागू नहीं किया जाता है। कम से कम, मुझे आशा है कि यह सच है।
संख्याओं से पहले ...
मुझे पोर्टेबिलिटी पर कुछ नोट्स बनाने चाहिए।
posh
पसंद नहीं करता है $((n=n+1))
और जोर देता है$((n=$n+1))
mksh
printf
ज्यादातर मामलों में एक अंतर्निहित नहीं है । पहले के परीक्षणों में यह काफी हद तक पिछड़ गया था - यह /usr/bin/printf
हर रन के लिए आह्वान कर रहा था । इसलिए echo -n
ऊपर।
शायद और अधिक के रूप में मैं इसे याद ...
वैसे भी, संख्या के लिए:
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
यह सब उन्हें एक बार में मिलेगा ...
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 ठीक है?
फिर भी, यह एक बल्कि मनमाना परीक्षण है, लेकिन यह रीडिंग इनपुट, अंकगणितीय मूल्यांकन और चर विस्तार का परीक्षण करता है। शायद व्यापक नहीं, लेकिन संभवतः वहाँ के निकट।
टेरेसा ई जूनियर द्वारा EDIT : @mikeserv और मैंने कई अन्य परीक्षण किए हैं ( विवरण के लिए हमारी चैट देखें), और हमने पाया कि परिणाम इस तरह संक्षेप में प्रस्तुत किए जा सकते हैं:
- यदि आपको गति की आवश्यकता है, तो निश्चित रूप से डैश के साथ जाएं , यह किसी भी अन्य शेल की तुलना में बहुत तेज है और बैश की तुलना में लगभग 4 गुना तेज है ।
- जबकि बिजीबॉक्स के खोल तुलना में बहुत धीमी हो सकता है पानी का छींटा , कुछ परीक्षण में यह तेजी से हो सकता है यह अपने आप ही userland उपयोगिताओं के कई है, क्योंकि, जैसे
grep
, sed
, sort
, आदि, जो आमतौर पर इस्तेमाल किया जीएनयू के रूप में कई सुविधाओं की जरूरत नहीं है उपयोगिताओं, लेकिन काम के रूप में ज्यादा मिल सकता है।
- अगर गति आपकी परवाह करने वाली हर चीज नहीं है, तो ksh (या ksh93 ) को गति और सुविधाओं के बीच सबसे अच्छा समझौता माना जा सकता है। इसकी गति छोटे mksh की तुलना में है , जो बैश की तुलना में तेज़ है , और इसमें कुछ अद्वितीय विशेषताएं भी हैं, जैसे फ़्लोटिंग पॉइंट आर्कटिक ।
- हालांकि बैश अपनी सादगी, स्थिरता और कार्यक्षमता के लिए प्रसिद्ध है, यह हमारे परीक्षणों के बहुमत में और बड़े अंतर से सभी गोले में सबसे धीमा था।