【问题标题】:Lua table access efficiencyLua表访问效率
【发布时间】:2014-06-09 03:03:48
【问题描述】:

我有一个关于访问 Lua 表中的数据的问题。
比如说,有一个像下面这样的大 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 中做了一个 for 循环?
或者就像 C/C++ 中的数组一样,我们可以使用 [ ] 直接访问内存,而无需使用 for 循环,
女巫显然有更好的表现。

【问题讨论】:

    标签: performance lua lua-table


    【解决方案1】:

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

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

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

    【讨论】:

    • @Schollii 我没有关注你。要访问散列中的元素,只需计算键的散列码并使用该散列码找到元素。它不如数组访问快,但假设哈希函数足够好,它仍然相当快(平均情况下为 O(1),最坏情况下为 O(lgN))。
    • @ColonelThirtyTwo 啊,是的,是的,是的,哈希函数使它成为 O(1) 操作,抱歉,我在考虑不同的结构。我的 cmets 具有误导性,因此我将删除。
    • @YuHao: 哈希表中find 操作的最坏情况... O(lgN)?我认为它在元素数量上是线性的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2012-09-08
    • 2012-01-01
    • 2018-04-12
    • 2013-06-15
    • 2016-08-09
    相关资源
    最近更新 更多