我必须创建一个“非常”轻松的脚本,它将从用户接收选项并调用脚本中的函数来执行某些任务。
现在我可以选择IF和CASE选项,但我想知道两者中哪一个更轻。当我把它放在脚本中时,CASE显然看起来不那么复杂,它是否使我的脚本在计算/ CPU使用/内存使用方面更轻或者IF更好?
该脚本将有大约10-15个输入选项可供选择,no。如果添加新功能,选择选项可能会在未来增加。
注意: - 它适用于在Solaris 10 / RHEL 6上运行的bash
答案 0 :(得分:8)
虽然我同意其他评论bash本身很慢,但我刚刚在这里执行了一些测试来检查差异。平台是Ubuntu 10.10在慢速机器上。没有其他进程并行运行。
CASE花费不到一半的时间,这是非常令人惊讶的:
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