Lua:__ index作为函数vs作为表的性能

时间:2010-12-04 19:45:02

标签: performance lua complexity-theory time-complexity

在Lua中,the __index metamethod可以是函数或表引用。所以以下结构是等价的:

foo = { a=1, b=2, c=3 }
bar = setmetatable({}, {__index = foo})
baz = setmetatable({}, {__index = function(_,x) return foo[x] end })

print(bar.a) -- 1
print(baz.b) -- 2

baz实施似乎会变慢。

但是慢多少?

我不太关心实施差异。我正在寻找的是“一般”的比较差异。我们是在谈论线性增量,一个数量级还是几个阶数?

提供一些背景信息:我正在开发a oop library,在最常见的情况下(95%),表就足够了。但是有一个特殊情况我需要一个函数。知道了差异将帮助我决定是否要在两个“拆”图书馆(一个快速,覆盖用途的95%,以及使用功能其余1个模块),或者只是倾倒的表选项支持的功能。< / p>

这个特殊的__index被广泛使用(每次调用实例方法时)。

如果这有帮助,我将使用的功能将非常小,类似于:

function __index(t,x) return foo[x] or bar[x] end

非常感谢。

1 个答案:

答案 0 :(得分:6)

在算法上它们是相同的。它们都解析为相同的哈希表查找,平均时间为O(1)。差异是不变的,主要来自函数调用开销。

在我的机器上,闭包比metatable查找慢约2.2倍(比直接查找慢2.5倍)。在Codepad's server上进行测试,差异为~2。

底线,在快速机器上(大约2010年),函数调用增加了大约十分之一微秒的恒定开销,否则性能是相同的。

顺便说一下,很多来自泥浆的LÖVE。 :)