Bash 루프는 루프 코어보다 1000배 더 비쌉니다.

Bash 루프는 루프 코어보다 1000배 더 비쌉니다.

다음은 약간의 실험입니다.

t1=$(date +%s%N)
ta=0
for i in `seq 1 1000`
do
    t1a=$(date +%s%N)
    echo blabla
    t2a=$(date +%s%N)
    ((ta=ta+(t2a-t1a)))
done
t2=$(date +%s%N)
echo diffb: $((t2-t1))ns
echo diffba: $((t2a-t1a))ns

결과:

diffb: 2767264439ns # this is the overall result
diffba: 1482172ns # this is the aggregated result for the core

지금 사람들이 생각하는 것을 볼 수 있습니다. 이것은 분명히 루프의 핵심 내에 있는 도구입니다. 하지만. IO 작업, 정렬, uniq, if, cp...를 포함하는 더 복잡한 루프에서 이것을 보았습니다. 몇 번 실행한 후 전체 루프 비용이 100x에서 1000x 사이가 되었습니다!

하지만 확실하게 하기 echo blabla위해 date +%s%N. 결과:

diffb: 3713962570ns
diffba: 2662492ns

이것은 확실히 악기가 아닙니다!

좋습니다. 다음을 시도해 보세요.

a=0; while [[ $((a++)) -lt 1000 ]];

결과:

diffb: 3761656210ns
diffba: 1953502ns

여기서 뭔가 빠졌나요? 여기에 이러한 결과가 잘못된 이유가 분명하게 나와 있습니까? 아니면 내가 현실을 우연히 발견한 걸까? Bash 루프는 우주에서 가장 높은 오버헤드를 가지고 있나요?

(코드를 최적화하고 싶어서 기준선 측정을 시작했는데 최적화가 안되는 것 같습니다.)

편집: 다른 작업을 수행하여 반복 횟수를 1000에서 500으로 줄였습니다(이 경우 while 루프를 사용했습니다). 결과는 다음과 같습니다.

diffb: 1886513017ns
diffba: 2328892ns

비교:

diffb: 3761656210ns
diffba: 1953502ns

코어가 비선형 시간, 지속적인 초기화 또는 커널 캐시 등에 도달했기 때문에 루프 오버헤드인 것 같습니다.

답변1

오류는 마지막 줄에 있습니다.

한 번의 반복 시간을 계산합니다. 1000번 반복하는 것보다 1000배 느립니다.

관련 정보