เปลือก SEQ:
น่าจะเป็นวิธีที่มีประโยชน์ในการทำเครื่องหมายบนม้านั่งประสิทธิภาพของเชลล์คือการประเมินผลขนาดเล็กมากและเรียบง่ายซ้ำ ๆ หลายครั้ง มันเป็นสิ่งสำคัญผมคิดว่าไม่เพียง แต่จะห่วง แต่ห่วงมากกว่าการป้อนข้อมูล<&0
เพราะเปลือกต้องการที่จะอ่าน
ฉันคิดว่าสิ่งนี้จะเป็นการเสริมการทดสอบ@cuonglm ที่โพสต์ไว้แล้วเพราะมันแสดงให้เห็นถึงประสิทธิภาพของกระบวนการเชลล์เดียวที่ถูกเรียกใช้ครั้งเดียวซึ่งตรงข้ามกับเขาซึ่งแสดงให้เห็นว่า ด้วยวิธีนี้ระหว่างเราเราครอบคลุมทั้งสองด้านของเหรียญ
นี่คือฟังก์ชั่นเพื่ออำนวยความสะดวกในการสาธิต:
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
builtin ในกรณีส่วนใหญ่ การทดสอบก่อนหน้านี้มีความล่าช้าอย่างมาก - มันเป็นการเรียกใช้/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 = อาจตกลงไหม
ถึงกระนั้นนี่คือการทดสอบโดยพลการ แต่มันทดสอบการอ่านอินพุตการประเมินทางคณิตศาสตร์และการขยายตัวของตัวแปร อาจจะไม่ครอบคลุม แต่อาจอยู่ใกล้กับที่นั่น
แก้ไขโดย Teresa e Junior : @mikeserv และฉันได้ทำการทดสอบอื่น ๆ อีกมากมาย (ดูการแชทของเราสำหรับรายละเอียด) และเราพบว่าผลลัพธ์สามารถสรุปได้ดังนี้:
- หากคุณต้องการความเร็วไปแน่นอนกับรีบมันจะเร็วกว่าเปลือกและอื่น ๆ เกี่ยวกับ 4x เร็วกว่าทุบตี
- ในขณะที่busyboxเปลือก 's สามารถเป็นได้ช้ากว่าเส้นประในการทดสอบบางอย่างมันอาจจะเร็วขึ้นเพราะมีหลายสาธารณูปโภค userland ของตัวเองเช่น
grep
, sed
, sort
เป็นต้นซึ่งไม่ได้มีคุณสมบัติมากที่สุดเท่าที่ใช้กันทั่วไป GNU สาธารณูปโภค แต่สามารถทำให้งานเสร็จได้มาก
- หากความเร็วไม่ใช่ทุกสิ่งที่คุณใส่ใจksh (หรือksh93 ) สามารถถูกพิจารณาว่าเป็นระบบที่ดีที่สุดระหว่างความเร็วและคุณสมบัติ มันเป็นความเร็วในการเปรียบเทียบกับขนาดเล็กmkshซึ่งเป็นวิธีที่เร็วกว่าทุบตีและมันยังมีคุณสมบัติพิเศษบางอย่างเช่นลอยคำนวณจุด
- แม้ว่าbashนั้นมีชื่อเสียงในเรื่องความเรียบง่ายความเสถียรและฟังก์ชั่น แต่มันก็ช้าที่สุดของกระสุนทั้งหมดในการทดสอบส่วนใหญ่ของเราและจากระยะขอบขนาดใหญ่