欢迎参与讨论,转载请注明出处。
前言
3.2 寄存器分配失败->减少local变量、避免过深的调用层次
很不幸的一点是,arm中可用的寄存器比x86少。LuaJIT为了速度,会尽可能用寄存器存储local变量,但是如果local变量太多,寄存器不够用,目前JIT的做法是:放弃治疗(有兴趣可以看看源码中asm_head_side函数的注释)。因此,我们能做的,只有按照官方优化指引说的,避免过多的local变量,或者通过do end来限制local变量的生命周期。
对此自然是可以理解的,哪怕是一般语言,local变量过多也会有堆栈溢出的问题。不过我对此一直有个隐忧:Lua是拥有模块级local变量的,不知是否也受此规则影响?尽管有此隐忧,却一直没有去做相关的探究。恰逢今日遇到相关话题,便来个刨根问底吧。
200限制
首先的发现是:一段过程下最多拥有200个local变量,且do end不算。类似这样:
local Class = {}
local test1 = 1
local test2 = 2
... --to 199
return Class
如果超过199,则会报出main function has more than 200 local variables的错误。当然这里说的是一段过程,所以函数是另算的,同样一个函数的过程最多也不能超过200个local变量(调用函数则算转入下一个过程了)。
这个限制是Lua与LuaJIT共有的,显然是想限制local数量的泛滥。
函数嵌