在我看来,有几种方法可以从Bash函数返回值。
方法1 :使用“本地全局”变量,该变量在调用方中定义为local
:
func1() {
a=10
}
parent1() {
local a
func1
a=$(($a + 1))
}
方法2 :使用命令替换:
func2() {
echo 10
}
parent2() {
a=$(func2)
a=$(($a + 1))
}
与方法2相比,使用方法1可以提高多少速度?
而且,我知道像方法1中那样使用全局变量并不是一种好的编程习惯,但是出于效率方面的考虑,在某个时候是否可以证明其合理性?
最佳答案
Shell脚本中最昂贵的操作就是派生。任何涉及到 fork 的操作(例如命令替换)将比不涉及 fork 的操作慢1-3个数量级。
例如,这是一种循环的简单方法,该循环以file-1234
的形式读取一堆生成的文件,并使用file-
去除sed
前缀,总共需要三个fork(命令替换+两阶段管道):
$ time printf "file-%s\n" {1..10000} |
while read line; do n=$(echo "$line" | sed -e "s/.*-//"); done
real 0m46.847s
这是一个循环,它与参数扩展功能相同,不需要 fork :
$ time printf "file-%s\n" {1..10000} |
while read line; do n=${line#*-}; done
real 0m0.150s
分支版本需要300倍的时间。
因此,您的问题的答案是肯定的:如果效率很重要,则您有充分的理由提出分解或替换派生代码的理由。
当派生计数相对于输入而言是恒定的(或者太杂乱而无法使其恒定),并且代码仍然太慢时,那就是您应该使用较快的语言重写它的时候。
关于bash - 当效率很重要时从函数返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29716774/