首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LUA表选择的性能智慧

LUA表选择的性能智慧
EN

Stack Overflow用户
提问于 2018-07-29 15:35:32
回答 2查看 133关注 0票数 1

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

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

示例:

代码语言:javascript
复制
 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值是随着插入新表值的时间增长而增加的,还是应该移动到有键的表中?或者我应该坚持使用基于数组的表,并在表不使用时执行完全清理?

EN

回答 2

Stack Overflow用户

发布于 2018-07-30 22:26:28

如果你将表中的一个元素设置为零,那么它就会留在你的数组中作为一个“洞”。

代码语言:javascript
复制
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)

代码语言:javascript
复制
tab = {1, 2, 3, 4}
table.remove(tab, 2)
-- tab == {1, 3, 4}
-- #tab == 3

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

票数 0
EN

Stack Overflow用户

发布于 2018-07-31 00:46:16

虽然table.remove(Table, 9)将在您的情况下做这项工作(从“数组”表中删除字段,并移动剩余的字段来填充空洞),但您应该首先考虑使用"set“表。

如果您:

  • 经常删除/添加元素
  • 不关心它们的顺序
  • 经常检查表格是否包含特定的元素

那么"set“表就是你的选择。像这样使用它

代码语言:javascript
复制
local tab = {
    ["John"] = true,
    ["Jane"] = true,
    ["Bob"] = true,
}

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

代码语言:javascript
复制
tab["Jane"] = nil

测试表是否包含元素

代码语言:javascript
复制
if tab["John"] then
    -- tab contains "John"

与数组表相比的优势:

  • 这将消除删除元素时的性能开销,因为其他元素将保持不变,并且没有移位。如果元素存在于此表中(我假设这是此表的主要假设),则它也比使用数组表更快,因为它不再需要迭代所有元素来查找匹配,而是使用散列查找而不是

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

代码语言:javascript
复制
local tab = {
    ["John"] = 1,
    ["Jane"] = 2,
    ["Bob"] = 35,
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51578253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档