两个案例哪个更快或者更快?

时间:2013-11-16 11:47:34

标签: linux bash unix if-statement switch-statement

我必须创建一个“非常”轻松的脚本,它将从用户接收选项并调用脚本中的函数来执行某些任务。

现在我可以选择IF和CASE选项,但我想知道两者中哪一个更轻。当我把它放在脚本中时,CASE显然看起来不那么复杂,它是否使我的脚本在计算/ CPU使用/内存使用方面更轻或者IF更好?

该脚本将有大约10-15个输入选项可供选择,no。如果添加新功能,选择选项可能会在未来增加。

注意: - 它适用于在Solaris 10 / RHEL 6上运行的bash

1 个答案:

答案 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