正如标题所说。如果我在lua中有一个表p,则使用
table.remove(p)
与
相同p[#p] = nil
如果是这样更快 - 我猜第二个,但是想要一些保证。
与'相同'我的意思是内部数组存储使用赋值为nil缩小了吗?我似乎无法在任何地方找到这个记录。将数组中的最后一个元素设置为nil,或者将数组中的最后10个元素设置为nil意味着数组是否会缩小,或者它是否始终保留存储并且永远不会再次收缩数组?
我假设数组是连续的,即它的值存储在每个数组条目中直到#p。
答案 0 :(得分:9)
将最后一个元素设置为nil
将不是函数调用。所以这样,它肯定会比table.remove
更快。多少重要取决于你。
与'相同'我的意思是内部数组存储使用赋值为nil缩小了吗?我似乎无法在任何地方找到这些文件。
没有记录;这允许实现改变。 Lua承诺的是,将其设置为nil
将减少后续调用#p
返回的大小。除此之外的任何事情都取决于Lua,并且肯定会在没有任何警告的情况下发生变化。你不应该依赖它。
但是,我谨慎地建议,如果您正在考虑这些微优化,那么您可能不应该使用脚本语言。脚本语言应该用于代码,其中性能不够重要,不能花费很多。
答案 1 :(得分:4)
p[#p] = nil
会更快,并且对于table.remove是最后位置的情况相同
作为额外注释,如果函数调用返回多个值,table.remove(func_call())
可能会发生意外情况。
答案 2 :(得分:3)
由Roberto Ierusalimschy(Lua的首席架构师)在Lua Performance Tips中所描述的Lua 5.1 VM的实现,表的分配存储在下次重新处理表之前不会改变 - 并且,一次又一次地陈述,你真的不应该考虑这个,除非你有很难分析数据显示它是一个重大问题。
至于table.remove(t)
和t[#t] = nil
之间的区别,请参阅我对What's the difference between `table.insert(t, i)` and `t[#t+1] = i`的回答。
答案 3 :(得分:2)
我认为最好与添加从数组类型表中删除元素一致。 table.insert
和table.remove
使您的代码更加一致且易于阅读。
Re:表Lua不会调整表的大小,直到你在之前删除了元素之后添加了第一个新元素。
答案 4 :(得分:1)
table.remove(p)
返回已删除的值。 p[#p] = nil
不返回任何内容。