在我看来,有几种方法可以从Bash函数返回一个值。
方法1 :使用“local-global”变量,在调用者中定义为local
:
func1() {
a=10
}
parent1() {
local a
func1
a=$(($a + 1))
}
方法2 :使用命令替换:
func2() {
echo 10
}
parent2() {
a=$(func2)
a=$(($a + 1))
}
使用方法1而不是方法2可以期望多少加速?
而且,我知道在方法1中使用全局变量并不是一个好的编程习惯,但是由于效率方面的考虑,它在某些时候是否合理?
答案 0 :(得分:4)
shell脚本中最昂贵的操作就是分叉。涉及fork的任何操作(例如命令替换)将比不使用fork的操作慢1-3个数量级。
例如,这是一个循环的直接方法,它在file-1234
的表单上读取一堆生成的文件,并使用file-
删除sed
前缀,需要总计三个叉子(命令替换+两阶段管道):
$ time printf "file-%s\n" {1..10000} |
while read line; do n=$(echo "$line" | sed -e "s/.*-//"); done
real 0m46.847s
这是一个循环,它通过参数扩展执行相同的操作,不需要任何分支:
$ time printf "file-%s\n" {1..10000} |
while read line; do n=${line#*-}; done
real 0m0.150s
forky版本需要300倍的时间。
因此,你的问题的答案是肯定的:如果效率很重要,你有充分的理由来分解或替换forky代码。
当fork计数相对于输入是恒定的(或者它太乱以至于不变)时,代码仍然太慢,那就是你应该用更快的语言重写它。
答案 1 :(得分:1)
肯定方法1比方法2快得多,因为它没有任何中断(反过来可能需要几个OS内核交叉到服务)并且只有一个内存访问!!!