Optimization 函数调用比动态计算更快?

Optimization 函数调用比动态计算更快?,optimization,lua,function-call,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

我现在非常困惑。我有一个函数,它创建了一个包含随机数目的表,我尝试了两种不同的方法来选择这个数(这有点不公平):

方法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
局部函数n()
局部n=math.random()
如果n<.7,则返回0
elseif n<.8然后返回1
结束
返回2
结束
局部函数final()
对于i=1,n()do
...
结束
结束
方法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
局部函数final()
局部n=math.random()
如果n<0.7,则n=0
如果n小于0.8,则n=1
否则n=2
结束
对于i=1,n do
...
结束
结束

问题是:出于某种原因,第一种方法的执行速度比第二种方法快30%。为什么会这样?

不,调用的速度永远不会比简单地内联它快。第一种方法的所有不同之处在于增加了设置堆栈和拆除堆栈的额外工作。其余的代码,无论是原始代码还是编译代码,都是完全相同的,因此“just calculation”比“just calculation+一些额外的工作”更快是很自然的


你的基准似乎不精确。对于这样一个轻量级函数,
For
循环和
os.clock
调用本身所用的时间几乎与函数本身所用的时间相同,因此,再加上
os.clock
固有的低资源和少量循环,您的数据在统计上并不显著,您主要看到的是硬件中随机出现的故障。使用更好的计时器,并将循环数增加到至少1000000。

不,调用速度永远不会比简单地内联它快。第一种方法的所有不同之处在于增加了设置堆栈和拆除堆栈的额外工作。其余的代码,无论是原始代码还是编译代码,都是完全相同的,因此“just calculation”比“just calculation+一些额外的工作”更快是很自然的


你的基准似乎不精确。对于这样一个轻量级函数,
For
循环和
os.clock
调用本身所用的时间几乎与函数本身所用的时间相同,因此,再加上
os.clock
固有的低资源和少量循环,您的数据在统计上并不显著,您主要看到的是硬件中随机出现的故障。使用更好的计时器并将循环数增加到至少1000000。

真的吗?我会说方法1会比较慢,因为重复全局访问全局
math
。你是如何测量它的?我会投票支持第二种方法,因为没有函数开销call@Ihf访问
math
的次数相同,如果你迫切需要表演,你也许应该考虑另一种语言。真正地我会说方法1会比较慢,因为重复全局访问全局
math
。你是如何测量它的?我会投票支持第二种方法,因为没有函数开销call@Ihf访问
math
的次数相同,如果你迫切需要表演,你也许应该考虑另一种语言。哈哈,1000个测试等待50-70秒已经很长了。@user6245072,您的代码中没有任何东西会造成这样的延迟。除了你没有发布的
部分。不使用它进行测量以查看真正的差异。事实是,不使用它,单函数方法比预期的更快。有了它,双函数方法速度更快。我发布了代码,哈哈,1000个测试等待50-70秒已经很长了。@user6245072,你的代码中没有任何东西会给你这样的延迟。除了你没有发布的
部分。不使用它进行测量以查看真正的差异。事实是,不使用它,单函数方法比预期的更快。有了它,双函数方法速度更快。我张贴了密码