我必须创建一个“非常”轻松的脚本,它将从用户接收选项并调用脚本中的函数来执行某些任务.
现在我可以使用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] 举报,一经查实,本站将立刻删除。