在Lua中,__index
元方法可以设置为函数或表,两者在性能和应用场景上有显著差异。以下是详细分析:
__index
作为表:直接查找指定表的键值,若不存在则返回nil
。__index
作为表:直接查找指定表的键值,若不存在则返回nil
。__index
作为函数:自定义查找逻辑,每次访问不存在的键时触发函数调用。__index
作为函数:自定义查找逻辑,每次访问不存在的键时触发函数调用。| 维度 | __index
作为表 | __index
作为函数 |
|----------------|----------------------------------------|----------------------------------------|
| 查找速度 | 更快(直接哈希查找) | 较慢(需调用函数,有调用开销) |
| 内存占用 | 需额外存储整个表 | 无额外表存储,仅函数引用 |
| 灵活性 | 仅支持静态键值映射 | 支持动态计算或复杂逻辑 |
| 缓存友好性 | 易被Lua内部缓存优化 | 函数调用难以缓存 |
通过基准测试对比两种方式(LuaJIT环境下):
local function benchmark()
local mt_table = { __index = { x = 1 } }
local mt_func = { __index = function() return 1 end }
local t1 = setmetatable({}, mt_table)
local t2 = setmetatable({}, mt_func)
local start = os.clock()
for i = 1, 1e6 do local _ = t1.x end
print("Table:", os.clock() - start)
start = os.clock()
for i = 1, 1e6 do local _ = t2.x end
print("Function:", os.clock() - start)
end
benchmark()
典型结果:表查找比函数快约2-5倍。
没有搜到相关的文章