
关于Lua metatable的性能问题
年前没活了,呜呜 由于我们业务层是使用lua,于是出于好奇心做了一些测试 lua的元表很好用,但是也会影响性能!这里测试了几种情况,结论也有些出乎意料 直接贴代码 ```lua local classA = { a = 1, b = 2, t = { d = 1 } } local classB = { d = 1 } local func = function(_t, key) return classB[key] end local t1 = os.clock() for i = 1, 1000000, 1 do local d = classA.a end dump("访问存在变量:" .. os.clock() - t1) local t2 = os.clock() for i = 1, 1000000, 1 do local d = classA.t.d end dump("访问子类变量:" .. os.clock() - t2) setmetatable(classA, { __index = func }) local t3 = os.clock() for i = 1, 1000000, 1 do local d = classA.d end dump("通过metatable访问变量(函数):" .. os.clock() - t3) setmetatable(classA, { __index = classB }) local t4 = os.clock() for i = 1, 1000000, 1 do local d = classA.d end dump("通过metatable访问变量(table):" .. os.clock() - t4) ``` 结论:慎用function!
年前没活了,呜呜
由于我们业务层是使用lua,于是出于好奇心做了一些测试
lua的元表很好用,但是也会影响性能!这里测试了几种情况,结论也有些出乎意料
直接贴代码
local classA = {
a = 1,
b = 2,
t = {
d = 1
}
}
local classB = {
d = 1
}
local func = function(_t, key)
return classB[key]
end
local t1 = os.clock()
for i = 1, 1000000, 1 do
local d = classA.a
end
dump("访问存在变量:" .. os.clock() - t1)
local t2 = os.clock()
for i = 1, 1000000, 1 do
local d = classA.t.d
end
dump("访问子类变量:" .. os.clock() - t2)
setmetatable(classA, {
__index = func
})
local t3 = os.clock()
for i = 1, 1000000, 1 do
local d = classA.d
end
dump("通过metatable访问变量(函数):" .. os.clock() - t3)
setmetatable(classA, {
__index = classB
})
local t4 = os.clock()
for i = 1, 1000000, 1 do
local d = classA.d
end
dump("通过metatable访问变量(table):" .. os.clock() - t4)

结论:慎用function!
