一张任务进度表先用数字键存了一千条顺序进度,后来又往里塞了几百个字符串键,读写耗时悄悄翻了三倍。根因在 Lua 表的内部布局:数组部分与哈希部分的迁移有隐性代价,混用的键会把表在两种布局之间反复搬运。理解了表布局,才知道为什么同一份逻辑换个键型就慢了一截。
顺序数字键走数组部分,插入字符串键触发布局调整;先建数组段再追加哈希键的写法,比交错插入的写法省一半初始化耗时。
local ok = {}
for i = 1, 10000 do
ok[i] = i
end
ok["meta"] = "沙巴克战况"
数组型数据与映射型数据拆成两张表各自存放,数组表保持纯数字键享受最快遍历,映射表承担查找职责,互不干扰。拆分后两类数据各自满速读写,进度查询与排名统计的耗时都回到了个位毫秒。
local seqData, mapData = {}, {}
local function put(idx, name, value)
seqData[idx] = value
mapData[name] = idx
end
local function scanAll()
local sum = 0
for i = 1, #seqData do
sum = sum + seqData[i]
end
return sum
end
一万条纯数字键与一万条混合键的插入耗时对比,混合版慢出一倍以上;遍历一千次纯数组表与混合表对比,纯数组快出三成;删除中途元素后用取长度语句核对边界。监控大表的取长度调用频次,高频取长度的代码点都是优化的候选。
表中段插入 nil 制造出空洞后,取长度返回值变成不可预期的截断点,依赖取长度做边界判断的代码随之出错,空洞表一律不依赖取长度。遍历顺序不保证与插入顺序一致,依赖顺序的展示逻辑改用显式排序。哈希段的键删除后空间并不立即归还,大批量删除后表容量维持高位,超大规模表用重建新表的方式真正缩容。构造表时先写数字后写字符串的顺序被代码格式化工具打乱过一次,混写顺序纳入了代码评审检查项。任务进度表拆分成顺序段与映射段后,读写在各自最优的布局上进行,两端通过序号关联互查。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 行会活动集中在攻城战,日常缺乏轻量社交场景。行会篝火答题做行会固定社交活动:每周三、周日晚在行会驻地点燃…
实战应用:用在哪里 全服答题活动办过几期,参与的人不少但黏性不足,答完就散。科举答题把答题做成两段式:每天晚八点的乡试答题筛…
n n n 实战应用:用在哪里 n战斗中打字沟通慢且危险,队伍协作靠喊话效率太低。快捷短语栏在屏幕底部提供八条可自定义的战斗…
n n n 实战应用:用在哪里 n龙脉区域的野外宝箱是散人玩家的每日福利:每逢整点在龙脉区域随机刷新十五个宝箱,分三档给不同…
实战应用:用在哪里 同一玩家的两条消息走了不同的处理路径,先发的后到,装备穿上的消息比脱下的消息晚处理,面板状态错乱。消息有…
实战应用:用在哪里 战斗日志全量打印,一天写满一块硬盘,翻日志像大海捞针。日志采样按类别分策略:错误日志全量保留、行为日志按…