Lua编译器是否优化了本地变量?

时间:2015-11-30 04:16:43

标签: lua compiler-optimization

当前的Lua编译器是否足够智能以优化用于清晰的局部变量?

local top = x - y
local bottom = x + y
someCall(top, bottom)

或者手动内联的内容运行得更快?

someCall(x - y, x + y)

1 个答案:

答案 0 :(得分:7)

由于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 并查看生成的(反汇编的)字节代码来检查编译器的功能。

在你的情况下,Lua代码

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 (跳过一些不相关的部分)时运行以下字节代码列表:

a

如您所见,第一个变体(MOVE函数)有两个额外的OpCode指令和另外两个本地人。

如果您对操作码的详细信息感兴趣,可以查看lopcodes.hOP_ADD枚举的评论。 例如。 OP_ADD,/* A B C R(A) := RK(B) + RK(C) */ 的操作码格式为:

2   [3] ADD         3 0 1

因此,上面的x获取寄存器0和1(本例中为本地yclass A: me = None def __init__(self): self.me = self.me def something(self, other): other = other self.me = "its me to change" return other #this function just return 'other' only. def call_me(self): something = A().something print something.__get__(self.me) #get variable 'self.me' only from function of 'something' A().call_me() )的值,将它们相加,并将结果存储在寄存器3中它是此函数中的第二个操作码,相应的源代码在第3行。