Performance 在桌子上留洞明智吗?

Performance 在桌子上留洞明智吗?,performance,lua,lua-table,Performance,Lua,Lua Table,注意:可能很难理解 假设我有一个表,它需要保存与保存对象的不同表相对应的索引。为了回答这个问题,我将把这些索引称为“idx”。我希望它能够快速删除特定的idx,同时也能够快速循环所有idx。 我希望这一切尽可能快,我有几个选择: 注意:我想说的是,最多可能有500-3000个对象,这意味着最多有那么多IDX引用它们。但是,我的表中一次存储的IDX可能不会超过200个。 我可以通过将每个idx推到表的末尾来存储它们,这样可以很容易地在它们上面循环,但是删除它们会产生问题,因为我必须在表中循环找到正

注意:可能很难理解

假设我有一个表,它需要保存与保存对象的不同表相对应的索引。为了回答这个问题,我将把这些索引称为“idx”。我希望它能够快速删除特定的idx,同时也能够快速循环所有idx。 我希望这一切尽可能快,我有几个选择:

注意:我想说的是,最多可能有500-3000个对象,这意味着最多有那么多IDX引用它们。但是,我的表中一次存储的IDX可能不会超过200个。

  • 我可以通过将每个idx推到表的末尾来存储它们,这样可以很容易地在它们上面循环,但是删除它们会产生问题,因为我必须在表中循环找到正确的idx,然后删除它

  • 我可以将表设置为一个集合,如这里所述(),这样可以非常快速地删除IDX,但不会太多地循环它们,因为我可能需要循环表中可能长达数千的所有空白。另外,我实际上会有很多这样的表包含IDX,所以我不认为有那么多这样长度的表是个好主意

  • 可能还有第三种或更多的解决方案,但我不确定。在这种情况下,最好做什么?或者这是我应该完全重新设计我的程序的信号

    作为第二个注意事项,我想提到的是,删除IDX可能在每一帧发生的次数比我需要循环它们的次数要多


    如果需要的话,我可以提供更多的上下文。

    你所说的一组表格中的空白是什么意思?例如,如果您打印
    local set={[1]=true,[200]=true}
    中的键,对于成对的k(set),do print(k)end,
    1
    200
    将被打印,没有间隙。是的,但它们之间不是有很大的零空间间隙?for循环是否至少检查当前索引是否为nil?我想,不管它是否执行其余的代码,它至少必须在间隙上循环。不,没有间隙。
    pairs(set)
    返回的迭代器三元组将遍历表中的所有键(按未定义的顺序),并且
    nil
    不是有效键<迭代结束时返回code>nil,它停止循环,因此循环中的
    k
    永远不会是
    nil
    。尝试创建一个具有大间距整数键的类似集合的表,并使用上面的代码打印它们,您将看到从未打印过
    nil
    。确定。所以那么,把它做成一套既快又有效吗?像存储了多少IDX或我有多少个集合这样的因素会使这变得更高效还是更低效?像table
    {1200}
    这样的密集数组比像table
    {[1]=true[200]=true}这样的相应集合使用的内存更少
    因为表使用数组部分和散列部分,而数组部分的内存效率更高,整数键的值可以放在那里,但这是一个实现细节,不是一个硬性规则。我不知道迭代哪个更快,可能差不多。我只使用最自然的一种。对于一组唯一的值,我使用一个类似集合的表。你说类似集合的表中的空白是什么意思?例如,如果您打印
    local set={[1]=true,[200]=true}
    中的键,对于成对的k(set),do print(k)end,
    1
    200
    将被打印,没有间隙。是的,但它们之间不是有很大的零空间间隙?for循环是否至少检查当前索引是否为nil?我想,不管它是否执行其余的代码,它至少必须在间隙上循环。不,没有间隙。
    pairs(set)
    返回的迭代器三元组将遍历表中的所有键(按未定义的顺序),并且
    nil
    不是有效键<迭代结束时返回code>nil,它停止循环,因此循环中的
    k
    永远不会是
    nil
    。尝试创建一个具有大间距整数键的类似集合的表,并使用上面的代码打印它们,您将看到从未打印过
    nil
    。确定。所以那么,把它做成一套既快又有效吗?像存储了多少IDX或我有多少个集合这样的因素会使这变得更高效还是更低效?像table
    {1200}
    这样的密集数组比像table
    {[1]=true[200]=true}这样的相应集合使用的内存更少
    因为表使用数组部分和散列部分,而数组部分的内存效率更高,整数键的值可以放在那里,但这是一个实现细节,不是一个硬性规则。我不知道迭代哪个更快,可能差不多。我只使用最自然的一种。对于一组唯一的值,我使用一个类似集合的表。