微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 哪个更快的两种情况还是如果?

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

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

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

注意: – 它适用于在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐