我现在感到很困惑。我有一个函数创建一个包含随机条目数的表,我尝试了两种不同的方法来选择这个数字(这有些小问题):
方法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%。这是为什么?
答案 0 :(得分:0)
不,呼叫永远不会比明确地内联更快。第一种方法的所有不同之处在于增加了设置堆栈和拆除堆栈的额外工作。其余的代码,无论是原始代码还是编译代码都是完全相同的,因此只需计算&#34;会比计算更快+一些额外的工作&#34;。
您的基准似乎不精确。对于这样的轻量级函数,for
循环和os.clock
调用本身将花费几乎与函数本身一样多的时间,因此结合os.clock
固有的低重新分配和少量循环,您的数据是并非真正具有统计意义,而且您主要在硬件中看到随机打嗝的结果。使用更好的计时器并将循环次数增加到至少1000000。