table.remove() 和 p[#p] = nil 是一样的吗?哪个更快?
正如标题所说。如果我有一个在lua中的表p,使用
table.remove(p)
和
p[#p] = nil
是一样的吗?如果是,哪个更快-我猜第二个,但希望得到一些确认。
我所说的“一样”是指使用赋值为nil,内部数组存储是否会缩小?我似乎找不到任何文件对此进行说明。将数组中的最后一个元素或数组中的最后10个元素设置为nil是否意味着数组将缩小,还是它始终保留存储并永远不会再次缩小数组?
我假设数组是连续的,即每个数组条目中都存储了值到#p。
原文链接 https://stackoverflow.com/questions/7129237
我认为,在向数组类型表中添加或删除元素时应该保持一致性。 table.insert
和 table.remove
使你的代码更加一致和易于阅读。
关于表 Lua 在你之前删除元素后第一次添加新元素之前不会调整表的大小。
作为额外的注意事项,如果函数调用返回多个值,则 table.remove(func_call())
可能会做出意想不到的事情。
p[#p] = nil
会更快,如果 table.remove
是最后一个位置,它们是相同的。
根据 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`。
table.remove(p)
返回被移除的值。p[#p] = nil
不返回任何值。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
将最后一个元素设置为
nil
不会产生函数调用。因此,在这种情况下,它肯定比table.remove
更快。这有多重要取决于你。这并没有被记录在文档中,这使得实现可以改变。Lua所承诺的只是将其设置为
nil
将减少随后对#p
的调用返回的大小。除此之外,其他事情就取决于Lua,并且肯定会随时更改。这不是你应该依赖的内容。但是,我尊重地建议如果你正在思考这些微观优化,那么你可能不应该使用脚本语言。脚本语言应该用于不需要过多关注性能的代码。