table.remove() 和 p[#p] = nil 是一样的吗?哪个更快?
2011-8-20 4:34:22
收藏:0
阅读:164
评论:5
正如标题所说。如果我有一个在lua中的表p,使用
table.remove(p)
和
p[#p] = nil
是一样的吗?如果是,哪个更快-我猜第二个,但希望得到一些确认。
我所说的“一样”是指使用赋值为nil,内部数组存储是否会缩小?我似乎找不到任何文件对此进行说明。将数组中的最后一个元素或数组中的最后10个元素设置为nil是否意味着数组将缩小,还是它始终保留存储并永远不会再次缩小数组?
我假设数组是连续的,即每个数组条目中都存储了值到#p。
点赞
用户151501
我认为,在向数组类型表中添加或删除元素时应该保持一致性。 table.insert 和 table.remove 使你的代码更加一致和易于阅读。
关于表 Lua 在你之前删除元素后第一次添加新元素之前不会调整表的大小。
2011-08-20 15:59:49
用户282536
作为额外的注意事项,如果函数调用返回多个值,则 table.remove(func_call()) 可能会做出意想不到的事情。
p[#p] = nil 会更快,如果 table.remove 是最后一个位置,它们是相同的。
2011-08-21 04:26:03
用户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
用户12048
table.remove(p) 返回被移除的值。p[#p] = nil 不返回任何值。
2013-03-15 15:27:54
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
将最后一个元素设置为
nil不会产生函数调用。因此,在这种情况下,它肯定比table.remove更快。这有多重要取决于你。这并没有被记录在文档中,这使得实现可以改变。Lua所承诺的只是将其设置为
nil将减少随后对#p的调用返回的大小。除此之外,其他事情就取决于Lua,并且肯定会随时更改。这不是你应该依赖的内容。但是,我尊重地建议如果你正在思考这些微观优化,那么你可能不应该使用脚本语言。脚本语言应该用于不需要过多关注性能的代码。