Performance 在桌子上留洞明智吗?
注意:可能很难理解 假设我有一个表,它需要保存与保存对象的不同表相对应的索引。为了回答这个问题,我将把这些索引称为“idx”。我希望它能够快速删除特定的idx,同时也能够快速循环所有idx。 我希望这一切尽可能快,我有几个选择: 注意:我想说的是,最多可能有500-3000个对象,这意味着最多有那么多IDX引用它们。但是,我的表中一次存储的IDX可能不会超过200个。Performance 在桌子上留洞明智吗?,performance,lua,lua-table,Performance,Lua,Lua Table,注意:可能很难理解 假设我有一个表,它需要保存与保存对象的不同表相对应的索引。为了回答这个问题,我将把这些索引称为“idx”。我希望它能够快速删除特定的idx,同时也能够快速循环所有idx。 我希望这一切尽可能快,我有几个选择: 注意:我想说的是,最多可能有500-3000个对象,这意味着最多有那么多IDX引用它们。但是,我的表中一次存储的IDX可能不会超过200个。 我可以通过将每个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}这样的相应集合使用的内存更少
因为表使用数组部分和散列部分,而数组部分的内存效率更高,整数键的值可以放在那里,但这是一个实现细节,不是一个硬性规则。我不知道迭代哪个更快,可能差不多。我只使用最自然的一种。对于一组唯一的值,我使用一个类似集合的表。