CHIA SẺ SEQ:
Có lẽ một phương tiện hữu ích để đánh dấu hiệu suất của vỏ là thực hiện nhiều đánh giá rất nhỏ, đơn giản lặp đi lặp lại. Điều quan trọng, tôi nghĩ, không chỉ là lặp, mà còn lặp qua đầu vào , bởi vì một vỏ cần phải đọc <&0
.
Tôi nghĩ rằng điều này sẽ bổ sung cho các bài kiểm tra @cuonglm đã được đăng bởi vì nó cho thấy hiệu suất của một quá trình shell duy nhất được gọi, trái ngược với thử nghiệm của nó cho thấy quá trình shell tải nhanh như thế nào khi được gọi. Theo cách này, giữa chúng tôi, chúng tôi bao gồm cả hai mặt của đồng tiền.
Đây là một chức năng để tạo điều kiện cho bản 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
Nó có thể tăng một biến một lần cho mỗi lần đọc dòng mới hoặc, như một sự tối ưu hóa nhẹ, nếu có thể, nó sẽ tăng 50 lần cho mỗi lần đọc dòng mới. Mỗi khi biến được tăng lên, nó được in ra stdout
. Nó hành xử rất giống như một loại seq
chéo nl
.
Và chỉ để làm cho nó rõ ràng những gì nó làm - đây là một số set -x;
đầu ra bị cắt sau khi chèn nó ngay trước đó time
trong chức năng trên:
time env - /usr/bin/busybox ash -c '
while echo; do echo; done |
/usr/bin/busybox ash -c '"'$(
cat <&3
)'"' -- 20 5 busybox'
Vì vậy, mỗi vỏ được gọi đầu tiên như:
env - $shell -c "while echo; do echo; done |..."
... Để tạo đầu vào mà nó sẽ cần lặp lại khi nó đọc vào 3<<\SCRIPT
- hoặc khi cat
nào, dù thế nào đi nữa. Và ở phía bên kia, |pipe
nó lại tự gọi mình như sau:
"...| $shell -c '$(cat <<\SCRIPT)' -- $args"
Vì vậy, ngoài cuộc gọi ban đầu đến env
(vì cat
thực sự được gọi trong dòng trước) ; không có quá trình nào khác được gọi từ khi nó được gọi cho đến khi nó thoát. Ít nhất, tôi hy vọng đó là sự thật.
Trước những con số ...
Tôi nên làm một số lưu ý về tính di động.
posh
không thích $((n=n+1))
và khăng khăng$((n=$n+1))
mksh
không có printf
nội dung trong hầu hết các trường hợp. Các thử nghiệm trước đó đã khiến nó bị tụt lại rất nhiều - nó được gọi /usr/bin/printf
cho mỗi lần chạy. Do đó, echo -n
ở trên.
có lẽ nhiều hơn khi tôi nhớ nó ...
Dù sao, với những con số:
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
Điều đó sẽ giúp họ có tất cả trong một lần ...
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
KIẾN TRÚC = CÓ THỂ OK?
Tuy nhiên, đây là một thử nghiệm khá độc đoán, nhưng nó kiểm tra đọc đầu vào, đánh giá số học và mở rộng biến. Có thể không toàn diện, nhưng có thể gần đó.
EDIT của Teresa e Junior : @mikeerv và tôi đã thực hiện nhiều bài kiểm tra khác (xem phần trò chuyện của chúng tôi để biết chi tiết) và chúng tôi thấy kết quả có thể được tóm tắt như thế này:
- Nếu bạn cần tốc độ, hãy đi chắc chắn với dấu gạch ngang , nó nhanh hơn nhiều so với bất kỳ vỏ nào khác và nhanh hơn khoảng 4 lần so với bash .
- Trong khi busybox vỏ 's có thể chậm hơn nhiều so với gạch ngang , trong một số xét nghiệm đó có thể là nhanh hơn, bởi vì nó có rất nhiều tiện ích Userland riêng của mình, giống như
grep
, sed
, sort
, vv, mà không có nhiều tính năng như GNU thường được sử dụng tiện ích, nhưng có thể hoàn thành công việc nhiều như vậy.
- Nếu tốc độ không phải là tất cả những gì bạn quan tâm, ksh (hoặc ksh93 ) có thể được coi là sự thỏa hiệp tốt nhất giữa tốc độ và tính năng. Tốc độ của nó so với mksh nhỏ hơn , nhanh hơn bash và nó cũng có một số tính năng độc đáo, như số học dấu phẩy động .
- Mặc dù bash nổi tiếng vì sự đơn giản, ổn định và chức năng của nó, nó là loại chậm nhất trong tất cả các loại đạn trong phần lớn các thử nghiệm của chúng tôi và bởi một biên độ lớn.