performance - Lua:__index 作为函数与作为表的性能

标签 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%),一张 table 就足够了。但是有一种特殊情况我需要一个函数。了解差异将帮助我决定是否将库“拆分”为两部分(一个快速并涵盖 95% 的使用,一个模块使用其余的函数)或只是转储 table 选项以支持该函数。

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

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

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

非常感谢。

最佳答案

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

在我的机器上,闭包比元表查找慢约 2.2 倍(比直接查找慢 2.5 倍)。测试 Codepad's server ,差是~2。

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

顺便说一句,Mud 非常喜欢。 :)

关于performance - Lua:__index 作为函数与作为表的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355450/

相关文章:

json - Lua 表 - 两个具有相同键的条目

javascript - 有没有最近的 Lua 到 JavaScript 的转换器或解释器?

algorithm - FP-Growth 算法的时空复杂度是多少?

algorithm - 算法的增长函数?

c# - 二维离散傅里叶变换的复杂性

c# - 访问 Microsoft.Office.Core.DocumentProperties 的性能问题

algorithm - 求和树的高效折叠

ubuntu - 找不到包 'lua' 但我已经安装了它

sql - 一张400GB表,一次查询——需要调优思路(SQL2005)

java - 为什么 cypher 查询或可能是 Neo4j 性能低下?