【问题标题】:Perfomance wise for LUA table selectionLUA 表选择的性能明智
【发布时间】:2018-07-29 07:35:31
【问题描述】:

我对 LUA 有点陌生。所以我有一个游戏,我需要捕获实体并插入到表中。可能同时发生的最大可能实体表是 14。所以我读到基于数组的解决方案很好。

但我看到即使我们删除一些值,表大小也会增加,例如从 10 表值中删除索引 9 处的值,当我想插入表号 11 时,它不会自动改变大小。

例子:

 local Table = {"hello", "hello", "hello", "hello", "hello", "hello", "hello", "hello", "hello", "hello"}
 -- Current Table size = 10
 -- Perform delete at index 9
 Table[9] = nil
 -- Have new Entity to insert
 Table[#Table + 1] = "New Value"
 -- The table size will grow by the time the game extend.

因此对于这种情况,在插入新表值时,内部具有 nil 值的基于数组的表是否会具有更好的性能,或者我应该使用键移入表中吗? 或者我应该坚持使用基于数组的表并在不使用表时执行完全清理?

【问题讨论】:

  • 试试table.remove(Table, 9)
  • @EgorSkriptunoff 谢谢。嗯很有趣。实际上 table.remove 移动了值。我想我会坚持使用 table.remove,而不是将表值设置为 nil。由于表大小也减小了,因此测试内存使用情况略有改善。

标签: performance lua


【解决方案1】:

如果您将表格中的一个元素设置为 nil,那么它将作为数组中的“洞”保留在那里。

tab = {1, 2, 3, 4}
tab[2] = nil
-- tab == {1, nil, 3, 4}
-- #tab is actually undefined and could be both 1 or 4 (or something completely unexpected)!

您需要做的是将该字段设置为 nil,然后移动以下所有字段以填充该孔。幸运的是,Lua 有一个函数,它是table.remove(table, index)

tab = {1, 2, 3, 4}
table.remove(tab, 2)
-- tab == {1, 3, 4}
-- #tab == 3

请记住,由于涉及大量内存访问,这可能会变得非常慢,所以当你有一天有几百万个元素时,不要去应用这个解决方案:)

【讨论】:

    【解决方案2】:

    虽然table.remove(Table, 9) 将在您的情况下完成这项工作(从“数组”表中删除字段并移动剩余字段以填补空白),但您应该首先考虑使用“设置”表。

    如果你:
    - 经常删除/添加元素
    - 不在乎他们的订单
    - 经常检查表是否包含某个元素

    那么“设置”表是您的选择。像这样使用它

    local tab = {
        ["John"] = true,
        ["Jane"] = true,
        ["Bob"] = true,
    }
    

    您的元素将作为索引存储在表中。 删除一个元素

    tab["Jane"] = nil
    

    测试表是否包含一个元素

    if tab["John"] then
        -- tab contains "John"
    

    相对于数组表的优势:
    - 这将消除删除元素时的性能开销,因为其他元素将保持不变并且不需要移动
    - 检查该表中是否存在元素(我假设这是该表的主要目的)也比使用数组表更快,因为它不再需要遍历所有元素来找到匹配项,而是使用哈希查找

    但是请注意,这种方法不允许您将重复值作为元素,因为表不能包含重复键。在这种情况下,您可以使用数字作为值来存储元素在您的集合中重复的次数,例如

    local tab = {
        ["John"] = 1,
        ["Jane"] = 2,
        ["Bob"] = 35,
    }
    

    现在你有 1 个 John、2 个 Janes 和 35 个 Bobs

    https://www.lua.org/pil/11.5.html

    【讨论】:

    • 我相信使用pairs 进行迭代比ipairs 慢一点。有人可以证实这一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2011-01-01
    相关资源
    最近更新 更多