0

我发现自己编程比迭代更多,并且经常编写重复计算的函数。例如,

function DoThis(a)
    if something(a) - another(a) - yetanother(a) > 0 then 
        return something(a) - another(a) - yetanother(a) 
    else 
        return 0 
    end 
end

我经常这样做,如果结果不会被使用超过几次。通常,将计算分配给变量是否更有效?

function DoThis(a)
    local x = something(a) - another(a) - yetanother(a)
    if x > 0 then 
        return x 
    else 
        return 0 
    end 
end

我知道这种情况下的差异可能可以忽略不计,但我有兴趣从一开始就养成良好的习惯,随着事情的积累和复杂化,差异可能会很大。

4

2 回答 2

2

如果您多次需要计算结果(函数的返回值),将其存储在变量中而不是重新计算它几乎总是一个好主意。特别是如果函数非常复杂,因此需要很长时间来计算召回,应该避免以提高性能。

于 2013-05-28T12:29:28.850 回答
2

一旦你开始了解细节,这个问题就会变得非常有趣。在某些情况下,您提供的每个代码示例都可能比另一个更有效。在这种情况下

something(a) - another(a) - yetanother(a)

总是小于或等于零 第一个代码示例会稍微高效一些,因为您避免分配给变量,因此数字永远不会离开用于计算的寄存器。

但是,如果该语句大于零,则第二个代码示例的效率要高得多,因为您避免了 3 个完整的函数调用,这些调用至少需要一个堆栈帧来设置变量和返回值。如果您的功能比 O(1) 效率差,那么差异将更加明显。

如果有人想用不同效率等级的某些功能进行速度测试,我会对结果感兴趣,它应该有助于说明我的观点。

于 2013-05-28T12:31:23.967 回答