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

我需要知道哪种方法更快,因为在一个对性能要求高的项目中我需要向一个表中插入元素。我运行了以下代码:

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("手动方式: "..total)

结果显示,第二种方法比第一种方法快了约 2 秒钟。

我知道第一种方法是一个函数调用,但是相比之下,第二种方法调用了 # 操作符,进行了一次加法运算,然后在 Lua 方面分配了一个索引值,而第一种方法则是在 C 方面执行这些操作。

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

点赞
用户4988149
用户4988149

因为函数调用的原因,展示下面的代码。该代码基于您的代码。

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

代码的作用相同,但增加了一个函数调用。

结果时间为:

table.insert:4.705

手动方法:4.752 <- insert函数

2016-08-02 08:15:47