table.remove() 和 p[#p] = nil 是一样的吗?哪个更快?

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

table.remove(p)

p[#p] = nil

是一样的吗?如果是,哪个更快-我猜第二个,但希望得到一些确认。

我所说的“一样”是指使用赋值为nil,内部数组存储是否会缩小?我似乎找不到任何文件对此进行说明。将数组中的最后一个元素或数组中的最后10个元素设置为nil是否意味着数组将缩小,还是它始终保留存储并永远不会再次缩小数组?

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

原文链接 https://stackoverflow.com/questions/7129237

点赞
stackoverflow用户734069
stackoverflow用户734069

将最后一个元素设置为 nil 不会产生函数调用。因此,在这种情况下,它肯定比 table.remove 更快。这有多重要取决于你。

通过“相同的”我指的是使用赋值为nil减少内部数组存储空间大小吗?我好像找不到任何文档。

这并没有被记录在文档中,这使得实现可以改变。Lua所承诺的只是将其设置为 nil 将减少随后对 #p 的调用返回的大小。除此之外,其他事情就取决于Lua,并且肯定会随时更改。这不是你应该依赖的内容。

但是,我尊重地建议如果你正在思考这些微观优化,那么你可能不应该使用脚本语言。脚本语言应该用于不需要过多关注性能的代码。

2011-08-20 04:55:52
stackoverflow用户151501
stackoverflow用户151501

我认为,在向数组类型表中添加或删除元素时应该保持一致性。 table.inserttable.remove 使你的代码更加一致和易于阅读。

关于表 Lua 在你之前删除元素后第一次添加新元素之前不会调整表的大小。

2011-08-20 15:59:49
stackoverflow用户282536
stackoverflow用户282536

作为额外的注意事项,如果函数调用返回多个值,则 table.remove(func_call()) 可能会做出意想不到的事情。

p[#p] = nil 会更快,如果 table.remove 是最后一个位置,它们是相同的。

2011-08-21 04:26:03
stackoverflow用户34799
stackoverflow用户34799

根据 Lua 的首席架构师 Roberto Ierusalimschy 在《Lua 性能贴士》中所述的 Lua 5.1 VM 实现,表的分配存储空间在下一次表的重新哈希之前不会改变。而且,如一再强调的那样,除非您有硬性的分析数据表明这是一个重大问题,否则您真的不应该考虑这个问题。

至于 table.remove(t)t[#t] = nil 之间的区别,请参见我的回答 What's the difference between `table.insert(t, i)` and `t[#t+1] = i`

2011-08-21 04:54:51
stackoverflow用户12048
stackoverflow用户12048

table.remove(p) 返回被移除的值。p[#p] = nil 不返回任何值。

2013-03-15 15:27:54