lua的局部变量为什么要比全局变量快

Posted preston

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua的局部变量为什么要比全局变量快相关的知识,希望对你有一定的参考价值。

这个点是绝大部分Lua性能问题产生的原因,尤其是和一个频繁调用的函数组合,会产生大量的开销。总的来说,我们在一个频繁调用的函数内,应该避免重复地去查询Table,应该把Table内我们常用的值缓存起来


不管是函数还是对象,不管是Lua自身的库,还是我们自己写的,在Lua中都是储存在_G中的某个节点下。当我们调用一个函数/对象的时候,Lua首先会去他们的表中查找到这个函数/对象,而我们使用局部变量的话,所以这个访问就会快很多


尤其是新来的开发者, 使用GetComponent来获取组件然后进行一些操作。由于没有用变量缓存起来,每次用完了就抛弃,再用再获取。这不仅会造成很大的耗时,还会造成很大的内存开销


在解析这个问题前, 我们先了解lua解析器是如何构造出局部变量的



当创建一个新变量时,最后会调用一个Singlevaraux来进行变量的查找,大致流程如下:


1. 如果变量在当前函数的LocVar结构体数组中找到,那么这个变量就是局部变量,类型为VLOCAL


2. 如果在当前函数中找不到,就往上一层block来查找,如果在某一层查到了,那么这个变量就是UpValue,类型为VUPVAL


3. 如果最后那层都没有查到,那么这个变量就是全局变量,类型为VGLOBAL


因为所有局部变量都会在函数栈中有一个对应的位置,所以把它的类型修改为VNONRELOC。


下图可见 因为变量a, b 在同一个函数栈中,所以使用指令Move1 0 完成将a 赋值给b 的操作 







以上是关于lua的局部变量为什么要比全局变量快的主要内容,如果未能解决你的问题,请参考以下文章

使用Lua 局部变量来优化性能,同一时候比較局部变量和全局变量

lua-require和dofile的区别(附加全局变量和局部变量的定义)

全局变量比C中的局部变量快吗? [关闭]

Lua_变量

Lua 变量

lua 变量