两种情况或 if 哪个更快? [关闭]

2024-05-18

我必须制作一个“非常”轻的脚本,它将接受用户的选项并调用脚本中的函数来执行一些任务。

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

该脚本将有大约 10-15 个输入选项可供选择,其中第一个是第一个。如果添加新功能,未来的选择可能会增加。

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


虽然我同意其他评论,即 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两种情况或 if 哪个更快? [关闭] 的相关文章

随机推荐