Lua编译器是否优化局部变量?
2015-11-30 4:16:43
收藏:0
阅读:95
评论:1
当前的 Lua 编译器是否足够聪明,可以优化掉仅用于更清晰的局部变量?
local top = x - y
local bottom = x + y
someCall(top, bottom)
还是手动内联运行更快?
someCall(x - y, x + y)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
由于 Lua 经常会将源代码即时编译成字节码,因此它被设计成具有快速的单通编译器。它确实进行了常量折叠,但除此之外没有太多优化。您通常可以通过执行
luac -l -l -p file.lua并查看生成的(反汇编的)字节码来检查编译器的操作。对于以下 Lua 代码:
function a( x, y ) local top = x - y local bottom = x + y someCall(top, bottom) end function b( x, y ) someCall(x - y, x + y) end运行
luac5.3 -l -l -p file.lua转换成的字节码如下所示(省略了一些无关紧要的部分):function <file.lua:1,5> (7 instructions at 0xcd7d30) 2 params, 7 slots, 1 upvalue, 4 locals, 1 constant, 0 functions 1 [2] SUB 2 0 1 2 [3] ADD 3 0 1 3 [4] GETTABUP 4 0 -1 ; _ENV "someCall" 4 [4] MOVE 5 2 5 [4] MOVE 6 3 6 [4] CALL 4 3 1 7 [5] RETURN 0 1 constants (1) for 0xcd7d30: 1 "someCall" locals (4) for 0xcd7d30: 0 x 1 8 1 y 1 8 2 top 2 8 3 bottom 3 8 upvalues (1) for 0xcd7d30: 0 _ENV 0 0 function <file.lua:7,9> (5 instructions at 0xcd7f10) 2 params, 5 slots, 1 upvalue, 2 locals, 1 constant, 0 functions 1 [8] GETTABUP 2 0 -1 ; _ENV "someCall" 2 [8] SUB 3 0 1 3 [8] ADD 4 0 1 4 [8] CALL 2 3 1 5 [9] RETURN 0 1 constants (1) for 0xcd7f10: 1 "someCall" locals (2) for 0xcd7f10: 0 x 1 6 1 y 1 6 upvalues (1) for 0xcd7f10: 0 _ENV 0 0可以看出,第二个代码片段(即
b函数)有两个额外的MOVE指令和两个额外的局部变量。如果您对操作码的详细信息感兴趣,可以查看 lopcodes.h 中的
OpCode枚举的注释。例如,OP_ADD的操作码格式如下:OP_ADD,/* A B C R(A) := RK(B) + RK(C) */因此,上面的
2 [3] ADD 3 0 1从寄存器 0 和 1 中获取值(在此情况下为局部变量x和y),将它们加在一起,并将结果存储在寄存器 3 中。它是该函数的第二个操作码,对应的源代码位于第三行。