通过引用与 ipairs 循环访问 table 的性能
Performance of accessing table via reference vs ipairs loop
我正在修改游戏。如果可能的话,我想针对经常调用的函数优化我的代码。该函数将查找字典 table(由估计的 10-100 个条目组成)。我正在考虑 2 种模式 a) 直接引用和 b) 使用 ipairs
:
查找
模式 A
tableA = { ["moduleName.propertyName"] = { some stuff } } -- the key is a string with dot inside, hence the quotation marks
result = tableA["moduleName.propertyName"]
模式 B
function lookup(type)
local result
for i, obj in ipairs(tableB) do
if obj.type == "moduleName.propertyName" then
result = obj
break
end
end
return result
end
***
tableB = {
[1] = {
type = "moduleName.propertyName",
... some stuff ...
}
}
result = lookup("moduleName.propertyName")
哪种模式的平均速度应该更快?我希望 'native' 引用更快(它肯定更整洁),但也许这是一个愚蠢的假设?我能够(在某种程度上)按照查找频率的顺序对 tableB
进行排序,而(据我所知)tableA
默认情况下 Lua 随机内部顺序甚至如果我以正确的顺序声明密钥。
查找 table 总是比每次搜索 table 快。
对于 100 个元素,这是一个索引操作,而最多 100 个循环周期、迭代器调用、条件语句...
尽管如此,如果您使用如此少的元素会在您的应用程序中体验到差异,这是值得怀疑的。
因此,如果您仅为此目的构建该数据结构,请立即进行查找 table。
如果您已经将此数据结构用于其他目的,并且只想查找一次,请循环遍历 table。
如果您已经有了这个结构并且需要多次查找值,请为此目的构建一个查找 table。
我正在修改游戏。如果可能的话,我想针对经常调用的函数优化我的代码。该函数将查找字典 table(由估计的 10-100 个条目组成)。我正在考虑 2 种模式 a) 直接引用和 b) 使用 ipairs
:
模式 A
tableA = { ["moduleName.propertyName"] = { some stuff } } -- the key is a string with dot inside, hence the quotation marks
result = tableA["moduleName.propertyName"]
模式 B
function lookup(type)
local result
for i, obj in ipairs(tableB) do
if obj.type == "moduleName.propertyName" then
result = obj
break
end
end
return result
end
***
tableB = {
[1] = {
type = "moduleName.propertyName",
... some stuff ...
}
}
result = lookup("moduleName.propertyName")
哪种模式的平均速度应该更快?我希望 'native' 引用更快(它肯定更整洁),但也许这是一个愚蠢的假设?我能够(在某种程度上)按照查找频率的顺序对 tableB
进行排序,而(据我所知)tableA
默认情况下 Lua 随机内部顺序甚至如果我以正确的顺序声明密钥。
查找 table 总是比每次搜索 table 快。
对于 100 个元素,这是一个索引操作,而最多 100 个循环周期、迭代器调用、条件语句...
尽管如此,如果您使用如此少的元素会在您的应用程序中体验到差异,这是值得怀疑的。
因此,如果您仅为此目的构建该数据结构,请立即进行查找 table。
如果您已经将此数据结构用于其他目的,并且只想查找一次,请循环遍历 table。
如果您已经有了这个结构并且需要多次查找值,请为此目的构建一个查找 table。