Lua表访问效率

Way*_*art 5 performance lua lua-table

我对访问Lua表中的数据有疑问。
说,有一个很大的Lua表,如下所示:

 tbl = {
         {
           blockIdx = 5,
           key1 = "val1",
           key2 = "val2",
           ...
         },
         {
           blockIdx = 30,
           key1 = "val11",
           key2 = "val12",
           ...
         },
         {
           blockIdx = 83,
           key1 = "val21",
           key2 = "val22",
           ...
         },
         ...
       }
Run Code Online (Sandbox Code Playgroud)

现在,我想找到一个块,blockIdx例如38
因此,通常情况下,我想使用for该块:

for k,v in pairs(tbl) do
     if v.blockIdx == 38 then
        blahFunction(v)
     end
end
Run Code Online (Sandbox Code Playgroud)

但是我认为这不是一个好主意,特别是对于大桌子。
所以我对表做了一些修改:

 tbl = {
         [5] = { 
           key1 = "val1",
           key2 = "val2",
           ...
         },
         [30] = {
           key1 = "val11",
           key2 = "val12",
           ...
         },
         [83] = {
           key1 = "val21",
           key2 = "val22",
           ...
         },
         ...
       }
Run Code Online (Sandbox Code Playgroud)

然后,我只需一行就可以轻松访问我的代码块:

blahFunction(tbl[38])
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,两种方法之间是否有性能差异?
也许tbl[38]实际上for在Lua内部做了一个循环?
或者就像C / C ++中的数组一样,我们可以使用[ ]不带for循环的方式直接访问内存,
显然,witch具有更好的性能。

Yu *_*Hao 5

性能不同,第二种方法效率更高。

在内部,Lua表包含一个数组部分和一个哈希部分,如果该表是一个序列,则序列部分由数组部分实现。但是第二个示例中的表不是序列,它可能是由哈希部分实现的。这种情况下的性能不像访问C / C ++中的数组,而是像访问哈希一样,这仍然非常快。

因此总而言之,第二段代码更快,因为它不会像第一个示例中那样遍历元素。

  • @Schollii我没有关注您。要访问哈希中的元素,所需要做的就是计算密钥的哈希码,并使用该哈希码查找元素。它不如数组访问快,但是假设哈希函数足够好,它仍然相当快(一般情况下为O(1),最坏情况下为O(lgN))。 (3认同)