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

Mar*_*cos 3 unix linux bash if-statement switch-statement

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

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

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

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

Aki*_*ira 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
Run Code Online (Sandbox Code Playgroud)

重复实验,但添加第三个比较:

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
Run Code Online (Sandbox Code Playgroud)

看起来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
Run Code Online (Sandbox Code Playgroud)

同样,CASE更快,但速度不快.

为了确定FOR-LOOP本身浪费的时间,让我们尝试几乎不运行:

user@machine:~$ time for i in {1..1000000}; do x=0; done

real    0m5.095s
user    0m5.070s
sys     0m0.010s
Run Code Online (Sandbox Code Playgroud)

  • 是.IF和CASE之间的差异几乎不重要.通常,shell脚本的性能很差,因为它们一直在调用外部程序来完成大部分繁重的工作:sed,awk,你可以命名它.但这个IF与CASE的比较是OP的质疑.然而,事实证明,IF以一致的方式比CASE慢得多. (2认同)