Lua: __index作为函数和__index作为表格的性能表现

在 Lua 中,[`__index](http://www.lua.org/pil/13.4.1.html) 元方法既可以是一个函数也可以是一个表引用。因此,以下构造是等效的:

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%用途的一个快速部分,以及一个在其余用途使用函数的部分),还是只保留函数选项。

这个特定的 __index 非常广泛地使用(每次调用实例方法时)。

如果有帮助,我将使用的函数将非常小,类似于以下内容:

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

万分感谢。

原文链接 https://stackoverflow.com/questions/4355450

点赞
stackoverflow用户501459
stackoverflow用户501459

算法上它们是一样的。它们都解析到同一个哈希表查找,平均时间为O(1)。不同之处在于常量,主要来自函数调用开销。

在我的机器上,闭包比元表查找慢了约2.2倍(比直接查找慢2.5倍)。在 Codepad 服务器 上测试,差别约为2。

最重要的是,在快速的机器上(大约在 2010 年左右),函数调用增加了约十分之一微秒的常量开销,否则性能是相同的。

顺便说一句,Mud 谨向大家表达爱意。 :)

2010-12-05 09:23:02