user@machine:~$ time for i in {1..1000000}; do if [ "$i" == "45" ]; then echo $i; elif [ "$i" == "50" ]; then echo $i; fi; done
45
50
real 0m22.154s
user 0m21.750s
sys 0m0.380s
user@machine:~$ time for i in {1..1000000}; do case "$i" in "45") echo $i;; "50") echo $i;; esac; done
45
50
real 0m10.286s
user 0m10.230s
sys 0m0.040s
重复实验,但添加第三个比较:
user@machine:~$ time for i in {1..1000000}; do if [ "$i" == "45" ]; then echo $i; elif [ "$i" == "50" ]; then echo $i; elif [ "$i" == "6000" ]; then echo $i; fi; done
45
50
6000
real 0m32.602s
user 0m32.070s
sys 0m0.510s
user@machine:~$ time for i in {1..1000000}; do case "$i" in "45") echo $i;; "50") echo $i;; "6000") echo $i;; esac; done
45
50
6000
real 0m13.553s
user 0m13.520s
sys 0m0.010s
看起来 IF 只是重复比较 3 次,而 CASE 进行一次比较,这可以解释为什么 CASE 几乎恒定,而 IF 似乎花费的时间与比较次数成正比。
现在检查建议的 [[ $i == 45 ]]:
user@machine:~$ time for i in {1..1000000}; do if [[ $i == 45 ]]; then echo $i; elif [[ $i == 50 ]]; then echo $i; elif [[ $i == 6000 ]]; then echo $i; fi; done
45
50
6000
real 0m15.127s
user 0m15.090s
sys 0m0.010s
user@machine:~$ time for i in {1..1000000}; do case $i in 45) echo $i;; 50) echo $i;; 6000) echo $i;; esac; done
45
50
6000
real 0m9.966s
user 0m9.940s
sys 0m0.010s
同样,CASE 更快,但也不是那么快。
为了尝试确定 FOR-LOOP 本身浪费的时间,让我们尝试几乎不运行任何内容:
user@machine:~$ time for i in {1..1000000}; do x=0; done
real 0m5.095s
user 0m5.070s
sys 0m0.010s