Bash 当效率重要时从函数返回值

Bash 当效率重要时从函数返回值,bash,Bash,在我看来,有几种方法可以从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可以期望多大的加速 而且,我知道像方

在我看来,有几种方法可以从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那样使用全局变量不是很好的编程实践,但出于效率考虑,它在某一点上是合理的吗?

方法1肯定比方法2快得多,因为它没有任何中断(这反过来可能需要几个操作系统内核交叉才能提供服务)并且只有一个内存访问

shell脚本中最昂贵的操作是分叉。任何涉及fork的操作,例如命令替换,都将比不涉及fork的操作慢1-3个数量级

例如,这里有一种直接的循环方法,它以
file-1234
的形式读取一组生成的文件,并使用
sed
去掉
file-
前缀,总共需要三个分叉(命令替换+两级管道):

这里有一个循环,它对参数扩展做同样的事情,不需要分叉:

$ time printf "file-%s\n" {1..10000} |
     while read line; do n=${line#*-}; done

real    0m0.150s
forky版本需要300倍的时间

因此,您的问题的答案是肯定的:如果效率很重要,您有充分的理由分解或替换forky代码


当fork计数相对于输入是恒定的(或者它太混乱而无法使其恒定),并且代码仍然太慢时,你应该用更快的语言重写它。

尝试运行基准测试?是的,在我的Ubuntu笔记本上,方法1似乎快了大约33倍:)当效率重要时,你停止使用
bash
(或任何口味的
sh
)。
$ time printf "file-%s\n" {1..10000} |
     while read line; do n=${line#*-}; done

real    0m0.150s