函数调用比飞行计算更快?

时间:2016-05-19 21:43:52

标签: optimization lua function-call

我现在感到很困惑。我有一个函数创建一个包含随机条目数的表,我尝试了两种不同的方法来选择这个数字(这有些小问题):

方法1,分离功能

local function n()
    local n = math.random()
    if n < .7 then return 0
    elseif n < .8 then return 1
    end
    return 2
end

local function final()
    for i = 1, n() do
        ...
    end
end

方法2,直接计算

local function final()
    local n = math.random()
    if n < .7 then n = 0
    elseif n < .8 then n = 1
    else n = 2
    end
    for i = 1, n do
        ...
    end
end

问题是:由于某种原因,第一种方法比第二种方法快30%。这是为什么?

1 个答案:

答案 0 :(得分:0)

不,呼叫永远不会比明确地内联更快。第一种方法的所有不同之处在于增加了设置堆栈和拆除堆栈的额外工作。其余的代码,无论是原始代码还是编译代码都是完全相同的,因此只需计算&#34;会比计算更快+一些额外的工作&#34;。

您的基准似乎不精确。对于这样的轻量级函数,for循环和os.clock调用本身将花费几乎与函数本身一样多的时间,因此结合os.clock固有的低重新分配和少量循环,您的数据是并非真正具有统计意义,而且您主要在硬件中看到随机打嗝的结果。使用更好的计时器并将循环次数增加到至少1000000。