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

时间:2015-04-18 11:37:02

标签: bash

在我看来,有几种方法可以从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中使用全局变量并不是一个好的编程习惯,但是由于效率方面的考虑,它在某些时候是否合理?

2 个答案:

答案 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内核交叉到服务)并且只有一个内存访问!!!