쉘 루프는 느리고 bash는 느립니다. 쉘은 루프에서 많은 작업을 수행하기위한 것이 아닙니다. 셸은 배치 데이터에서 최적화 된 몇 가지 외부 최적화 프로세스를 시작하기위한 것입니다.
어쨌든 쉘 루프가 어떻게 비교되는지 궁금해서 약간의 벤치 마크를 만들었습니다.
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
세부 사항 :
- CPU : Intel (R) Core (i) i5 CPU M 430 @ 2.27GHz
- ksh : 버전 sh (AT & T Research) 93u + 2012-08-01
- bash : GNU bash, 버전 4.3.11 (1)-릴리스 (x86_64-pc-linux-gnu)
- zsh : zsh 5.2 (x86_64-unknown-linux-gnu)
- 대시 : 0.5.7-4 우분투 1
)
(축약 된) 결과 (반복 당 시간)는 다음과 같습니다.
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
결과에서 :
약간 더 빠른 쉘 루프 [[
를 원한다면 구문이 있고 빠른 쉘 루프를 원한다면 고급 쉘에 있고 C와 같은 for 루프도 있습니다. 그런 다음 C for for 루프를 사용하십시오. while [
동일한 쉘에서 -loops의 약 2 배 빠릅니다 .
- ksh 는 반복 당
for (
약 2.7µs 에서 가장 빠른 루프를 갖습니다.
- 대시 는 반복 당
while [
약 5.8µs 에서 가장 빠른 루프를 갖습니다.
C for 루프는 10-4 배 더 빠를 수 있습니다. (토발즈가 C를 좋아한다고 들었습니다).
최적화 된 C for 루프는 bash while [
루프 (가장 느린 쉘 루프)보다 56500 배 빠르며 ksh for (
루프 (가장 빠른 쉘 루프) 보다 6750 배 빠릅니다 .
쉘의 일반적인 패턴은 외부의 최적화 된 프로그램의 몇 가지 프로세스로 오프로드하는 것이기 때문에 쉘의 속도 저하는 중요하지 않습니다.
이 패턴을 사용하면 쉘은 종종 파이썬 스크립트보다 우수한 성능의 스크립트를 작성하는 것을 훨씬 쉽게 만듭니다 (마지막으로 확인했을 때 파이썬에서 프로세스 파이프 라인을 만드는 것은 다소 어색했습니다).
고려해야 할 또 다른 사항은 시작 시간입니다.
time python3 -c ' '
내 PC에서 30 ~ 40ms가 걸리고 쉘은 약 3ms가 걸립니다. 많은 스크립트를 실행하면 빠르게 추가되고 파이썬이 시작하는 데 걸리는 27-37ms의 추가 시간에 매우 많은 일을 할 수 있습니다. 작은 스크립트는 해당 시간 프레임에서 여러 번 끝낼 수 있습니다.
(NodeJ는 아마도 시작하는 데 약 100ms가 걸리기 때문에이 부서에서 가장 최악의 스크립팅 런타임 일 것입니다.