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

  • 内容
  • 相关
小蓝博客收集整理的这篇文章主要介绍了Lua编译器是否优化了本地变量?,小蓝博客小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当前的Lua编译器是否足够智能以优化用于清晰的局部变量?

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

或者手动内联的速度更快?

someCall(x - y,x + y)

解决方法

由于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,2 locals,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

如您所见,第一个变体(一个函数)有两个额外的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中.这是第二个操作码功能和相应的源代码在第3行.

总结

以上是小蓝博客为你收集整理的Lua编译器是否优化了本地变量?全部内容,希望文章能够帮你解决Lua编译器是否优化了本地变量?所遇到的程序开发问题。

如果觉得小蓝博客网站内容还不错,欢迎将小蓝博客网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 打赏支付宝扫一扫
  • 打赏微信扫一扫
  • 打赏企鹅扫一扫

本文标签:

版权声明:若无特殊注明,本文皆为《小蓝博客》原创,转载请保留文章出处。

本文链接:Lua编译器是否优化了本地变量? - https://www.nswin.cc/29758.html