쉘에서 비트 단위 이동보다 정수 나누기가 더 빠른 이유는 무엇입니까?

쉘에서 비트 단위 이동보다 정수 나누기가 더 빠른 이유는 무엇입니까?

과 .( Xubuntu 18.04의 기본값) bash의 성능을 비교하고 있습니다 .dashsh

  • 나는 sh그것이 더 나을 것이라고 기대한다.bash
  • 비트 단위 이동이 나눗셈 연산자보다 빠를 것으로 예상합니다.

그러나 불일치가 발생했습니다.

λ hyperfine --export-markdown a.md -w 3 ./*
Benchmark #1: ./calc-div.bash
  Time (mean ± σ):      2.550 s ±  0.033 s    [User: 2.482 s, System: 0.068 s]
  Range (min … max):    2.497 s …  2.595 s    10 runs

Benchmark #2: ./calc-div.sh
  Time (mean ± σ):      2.063 s ±  0.016 s    [User: 2.063 s, System: 0.000 s]
  Range (min … max):    2.043 s …  2.100 s    10 runs

Benchmark #3: ./calc-shift.bash
  Time (mean ± σ):      3.312 s ±  0.034 s    [User: 3.255 s, System: 0.057 s]
  Range (min … max):    3.274 s …  3.385 s    10 runs

Benchmark #4: ./calc-shift.sh
  Time (mean ± σ):      2.087 s ±  0.046 s    [User: 2.086 s, System: 0.001 s]
  Range (min … max):    2.058 s …  2.211 s    10 runs

Summary
  './calc-div.sh' ran
    1.01 ± 0.02 times faster than './calc-shift.sh'
    1.24 ± 0.02 times faster than './calc-div.bash'
    1.61 ± 0.02 times faster than './calc-shift.bash'
주문하다 방법] 분] 최대 [초] 비교적
./calc-div.bash 2.550±0.033 2,497 2.595 1.24±0.02
./calc-div.sh 2.063±0.016 2.043 2.100 1.00
./calc-shift.bash 3.312±0.034 3.274 3.385 1.61±0.02
./calc-shift.sh 2.087±0.046 2.058 2.211 1.01±0.02

제가 테스트한 스크립트는 다음과 같습니다.

div.bash 계산

#!/usr/bin/env bash

for i in {1..1000000}; do
    _=$(( i / 1024 ))
done

계산된iv.sh


i=1
while [ $i -le 1000000 ]; do
    _=$(( i / 1024 ))
    i=$(( i + 1 ))
done

Shift.bash 계산


for i in {1..1000000}; do
    _=$(( i >> 10 ))
done

Shift.sh 계산

#!/usr/bin/env sh

i=1
while [ $i -le 1000000 ]; do
    _=$(( i >> 10 ))
    i=$(( i + 1 ))
done

5000000의 경우 차이가 더욱 두드러집니다.

주문하다 방법] 분] 최대 [초] 비교적
./calc-div.bash 13.333±0.202 12.870 13.584 1.23±0.02
./calc-div.sh 10.830±0.119 10.750 11.150 1.00
./calc-shift.bash 17.361±0.357 16.995 18.283 1.60±0.04
./calc-shift.sh 11.226±0.351 10.834 11.958 1.04±0.03
Summary
  './calc-div.sh' ran
    1.04 ± 0.03 times faster than './calc-shift.sh'
    1.23 ± 0.02 times faster than './calc-div.bash'
    1.60 ± 0.04 times faster than './calc-shift.bash'

보시다시피 bashsum 의 dash경우 나누기 연산자는 동등한 오른쪽 비트 단위 이동보다 빠릅니다.

관련 정보