函数调用比即时计算更快吗?

我现在很困惑。我有一个函数,它创建一个具有随机条目数量的表格,并尝试两种不同的方法来选择该数字(这在一定程度上是有权重的):

方法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%。为什么呢?

点赞
用户936986
用户936986

不会有比直接内联更快的方法来调用函数。第一种方法的唯一区别是添加了设置堆栈和拆卸堆栈的额外工作。代码的其余部分,无论是原始的还是编译的,都完全相同,所以“仅仅是计算”肯定比“计算加上一些额外的工作”更快。

您的基准测试似乎不太精确。对于这样轻量级的函数,一个for循环和一个os.clock调用本身所需的时间几乎与函数本身的时间相同,所以结合os.clock固有的低分辨率和少量的循环,您的数据实际上不具备统计学意义,并且您主要看到的是硬件中随机故障的结果。使用更好的计时器,并将循环次数增加到至少1000000次。

2016-05-20 10:23:42