Performance Lua表访问效率
我对访问Lua表中的数据有疑问。Performance Lua表访问效率,performance,lua,lua-table,Performance,Lua,Lua Table,我对访问Lua表中的数据有疑问。 比如说,有一个大型Lua表,如下所示: tbl = { { blockIdx = 5, key1 = "val1", key2 = "val2", ... }, { blockIdx = 30, key1 = "val11", key2 = "val12"
比如说,有一个大型Lua表,如下所示:
tbl = {
{
blockIdx = 5,
key1 = "val1",
key2 = "val2",
...
},
{
blockIdx = 30,
key1 = "val11",
key2 = "val12",
...
},
{
blockIdx = 83,
key1 = "val21",
key2 = "val22",
...
},
...
}
现在我想找到blockIdx
中的一个块,例如,38
所以通常,我想使用
for
来查找块:
for k,v in pairs(tbl) do
if v.blockIdx == 38 then
blahFunction(v)
end
end
但我认为这不是一个好主意,尤其是对于大桌子。所以我稍微修改了一下表格:
tbl = {
[5] = {
key1 = "val1",
key2 = "val2",
...
},
[30] = {
key1 = "val11",
key2 = "val12",
...
},
[83] = {
key1 = "val21",
key2 = "val22",
...
},
...
}
然后,我可以通过一行轻松访问我的区块:
blahFunction(tbl[38])
所以我的问题是,这两种方法的性能有什么不同吗?也许做
tbl[38]
实际上在Lua内部做了一个循环
或者就像C/C++中的数组一样,我们可以使用[]
直接访问内存,而不使用for
循环,
witch显然有更好的性能。性能不同,第二种方法更有效
在内部,Lua表包含一个数组部分和一个哈希部分,如果表是一个序列,那么序列部分由数组部分实现。但第二个示例中的表不是序列,它可能是由哈希部分实现的。这种情况下的性能不像在C/C++中访问数组,而是像访问哈希一样,仍然非常快
总之,第二段代码速度更快,因为它不像第一个示例那样遍历元素。@Schollii我不在这方面跟你讲。要访问散列中的元素,只需计算键的散列码并使用该散列码查找元素。它不如数组访问速度快,但假设哈希函数足够好,它仍然相当快(一般情况下为O(1),最坏情况下为O(lgN)。@ColonelThirtyTwo啊,是的,是的,哈希函数使它成为一个O(1)操作,很抱歉,我在考虑另一种结构。我的评论有误导性,所以我将删除。@YuHao:hash表中find
操作的最坏情况。。。O(lgN)?我认为元素的数量是线性的。