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

3
在Lua中,__index元方法可以是函数或表引用。因此,以下构造是等效的:
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的实现会更慢一些,但是有多慢呢?我并不关心具体实现上的差异,我想知道的是相对差别。是线性增长、一个数量级还是几个数量级?为了更好地理解,我正在开发一个面向对象库middleclass,在大多数情况下(95%)使用表就足够了。但是有一种特殊情况需要使用函数。了解差异将帮助我决定是否将库分成两部分(一个快速且覆盖95%的用例,另一个模块则针对其余部分使用函数),或者放弃表选项而选择函数。这个特定的__index被广泛使用(每次调用实例方法时都会使用)。如果有帮助的话,我将使用非常小的函数,类似于这个:
function __index(t,x) return foo[x] or bar[x] end

非常感谢。

2
为什么不自己对其进行性能分析? - Kknd
我可以在我的电脑上对其进行分析,但我并不真正关心“在具有x处理器和x内存的Ubuntu机器上实现速度有多快”。我想知道它们在算法上有多大的差异。 - kikito
所以...让我看看我是否理解正确。你对它在现实世界中的性能不感兴趣,只关注它的假设性能。明白了。 - JUST MY correct OPINION
我对了解数量级很感兴趣 - 就像O(n)与O(n²)。机器上的个别结果并不能帮助我很好地理解它。也许我的英语表达不够清晰。 - kikito
1个回答

8

从算法上讲,它们是相同的。它们都会解析为相同的哈希表查找,平均时间复杂度为O(1)。不同之处在于常数,主要来自函数调用开销。

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

总之,在快速的机器上(大约是2010年),函数调用增加了约0.1微秒的常量开销,否则性能是相同的。

顺便说一句,Mud向LÖVE致以深情的问候。 :)


谢谢您的回复。现在我有一个数字在脑海里,我可以做决定了。 - kikito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接