table.remove()与p [#p] = nil相同,哪个更快?

时间:2011-08-20 02:29:27

标签: lua

正如标题所说。如果我在lua中有一个表p,则使用

table.remove(p)

相同
p[#p] = nil

如果是这样更快 - 我猜第二个,但是想要一些保证。

与'相同'我的意思是内部数组存储使用赋值为nil缩小了吗?我似乎无法在任何地方找到这个记录。将数组中的最后一个元素设置为nil,或者将数组中的最后10个元素设置为nil意味着数组是否会缩小,或者它是否始终保留存储并且永远不会再次收缩数组?

我假设数组是连续的,即它的值存储在每个数组条目中直到#p。

5 个答案:

答案 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.inserttable.remove使您的代码更加一致且易于阅读。

Re:表Lua不会调整表的大小,直到你在之前删除了元素之后添加了第一个新元素。

答案 4 :(得分:1)

table.remove(p)返回已删除的值。 p[#p] = nil不返回任何内容。