쉘 시퀀스 :
아마도 쉘의 성능을 벤치마킹하는 유용한 방법은 매우 작고 간단한 평가를 반복적으로 수행하는 것입니다. 쉘은 읽어야하기 때문에 루프하는 것이 아니라 입력 을 반복하는 것이 중요하다고 생각 합니다 <&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
실제로 이전 행에서 호출 되기 때문에 ) ; 호출 된 시점부터 종료 될 때까지 다른 프로세스는 호출되지 않습니다. 적어도 나는 그것이 사실이기를 바랍니다.
숫자 앞에 ...
이식성에 대해 몇 가지 참고해야합니다.
어쨌든 숫자로 :
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
임의의 = 괜찮을까요?
그러나 이것은 다소 임의적 인 테스트이지만 읽기 입력, 산술 평가 및 변수 확장을 테스트합니다. 아마도 포괄적이지는 않지만 아마도 근처에있을 수도 있습니다.
Teresa e Junior의 편집 : @mikeserv 그리고 다른 많은 테스트를 수행했으며 (자세한 내용 은 채팅 참조) 결과는 다음과 같이 요약 될 수 있습니다.
- 속도가 필요하다면 dash 로 확실히 가십시오. 다른 쉘보다 훨씬 빠르며 bash 보다 약 4 배 빠릅니다 .
- 하지만 비지 박스 의 쉘보다 훨씬 속도가 느려질 수 있습니다 대시 는 자신의 유저 랜드 유틸리티의 대부분을 가지고 있기 때문에, 몇 가지 테스트에서는 빠를 수와 같은
grep
, sed
, sort
, 등, 일반적으로 사용되는 GNU만큼 많은 기능을 가지고 있지 않는 유틸리티, 그러나 작업을 많이 얻을 수 있습니다.
- 속도가 관심있는 모든 것이 아닌 경우 ksh (또는 ksh93 )는 속도와 기능 사이의 최상의 타협으로 간주 될 수 있습니다. 속도는 작은 mksh 와 비교할 때 bash 보다 빠르며 부동 소수점 산술 과 같은 고유 한 기능도 있습니다 .
- bash 는 단순성, 안정성 및 기능성으로 유명 하지만 대부분의 테스트에서 모든 쉘 중 가장 느리고 마진이 큽니다.