Optimization 为什么t[#t+;1]=e比table.insert(t,e)快?

Optimization 为什么t[#t+;1]=e比table.insert(t,e)快?,optimization,lua,lua-table,Optimization,Lua,Lua Table,我需要知道哪种方法更快,因为我需要在一个项目中的表中插入一些元素,其中性能非常重要。我已经运行了以下代码: local total = 0 local mytable = {} for i = 1, 1e7 do local clock = os.clock local push = table.insert local t = clock() push(mytable, 0) t = clock() - t total = total +

我需要知道哪种方法更快,因为我需要在一个项目中的表中插入一些元素,其中性能非常重要。我已经运行了以下代码:

local total = 0

local mytable = {}

for i = 1, 1e7 do
    local clock = os.clock
    local push = table.insert
    local t = clock()

    push(mytable, 0)

    t = clock() - t
    total = total + t
end

print("table.insert: "..total)

local total = 0

local mytable = {}

for i = 1, 1e7 do
    local clock = os.clock
    local t = clock()

    mytable[#mytable + 1] = 0

    t = clock() - t
    total = total + t
end

print("Manual approach: "..total)
结果表明,第二种方法比第一种方法快2秒左右

我知道第一个是函数调用,但与之相反,第二个调用
#
操作符,进行加法,然后将索引赋给一个值,都在Lua端,而第一个在C端

那么为什么第二种方法更快呢?函数真的那么慢吗?

因为函数调用。 显示下一个代码。此代码基于您的代码

function insert(t, v)
    t[#t + 1] = v
end

for i = 1, 1e7 do
    local clock = os.clock
    local t = clock()

    --mytable[#mytable + 1] = 0
    insert(mytable, 0)

    t = clock() - t
    total = total + t
end
代码工作原理相同,但增加到一个函数调用

结果时间是 表4.705插入:4.705


人工进近:4.752
i=i+1;t[i]=e
比移动时钟和
local push=table更快。在循环外部插入
。事实上,您可能正在测量对全局变量的访问。整个过程对我来说快了三倍。这两种方法相差7%。@Egor Skriptunoff你的意思是我应该保留一个包含表长度的变量吗?@Egor Skiptunoff是的,当然可以删除
开销。。。但这听起来有点极端。@user6245072:那“极端”是什么意思?您是关心热循环中表插入的性能的人。如果您非常关心做一个测试,那么您应该非常关心做任何事情以获得最佳性能。