lua table数组使用优化

1,添加时arr[#arr + 1] = item,比table.insert(arr, item)更快

  前者是 Lua 虚拟机直接执行的原生字节码指令(取长度、加法、赋值),几乎没有额外开销

  后者有函数调用开销:虽然它底层也是用 C 实现的,但调用它需要创建调用栈帧,在热点循环(如每秒执行上万次)中,存在20%~30% 的差距

 

2,尾部删除时,arr[#arr] = nil,比table.remove(arr, i)更快

  前者是Lua 虚拟机直接执行的 2~3 条原生字节码(取长度、置空),零函数调用开销,也不会有#arr获取长度问题

  后者需要查找全局表、调用 C 函数、处理元表,有额外的函数栈帧开销

  性能差距明显:在单次操作中差距仅纳秒级,但在高频循环(如每帧清空队列)中,前者通常比后者快 30%~50%

  两者都只是把最后一个槽位置为 nil 并递减逻辑长度,都不会触发任何内存拷贝

 

3,中间删除时,只能用table.remove

 

4,删除多个元素

---@generic T
---@param list T[]
---@param toRemoveDict table<T, boolean>
local function RemoveAll(list, toRemoveDict)
    local cnt = #list
    local writeIdx = 1
    for i=1,cnt do
        local v = list[i]
        if not toRemoveDict[v] then
            list[writeIdx] = v
            writeIdx = writeIdx + 1
        end
    end
    
    --删除尾部多余元素
    for i=cnt,writeIdx,-1 do 
        list[i] = nil 
    end
end

 

posted @ 2026-08-27 23:54  yanghui01  阅读(23)  评论(0)    收藏  举报