把我的本地函数变为全局函数,这样做是不是多此一举?

我读过一篇文章,说把大部分的函数保持为本地函数而不是全局函数,可以使程序运行得更快更好。

所以我这样写:

input = require("input")
draw = require("draw")

然后在 input.lua 中:

local tableOfFunctions = {isLetter = isLetter, numpadCheck = numpadCheck, isDigit = isDigit, toUpper = toUpper}
return tableOfFunctions

其中 isLetter、numpadCheck 等等都是该文件的本地函数。然后我这样调用函数:

input.isLetter(key)

我想问的问题是:这样做是不是白费力气?全局函数不是存储在 Lua 表中吗?我喜欢 input. 在函数名前面,这样看起来很整齐,如果这样不是不良的编码习惯的话,我可能还是会保留它的。

点赞
用户4687565
用户4687565

重新发明满足个人需求的轮子是Lua的核心。创造者在他的书中这里中描述了你所描述的方法是有效的。

在Lua中,所有都存储在表中。 "更快"的本地函数(以及更快的本地变量)来自于全局变量和upvalue查找的方式。 下面是一个相关的更详细的解释速度的引用,它发生在一个游戏的论坛中. 除此之外,由于代码的干净和错误防护,建议使用局部变量。


在lua中,使用{}创建表,这个运算符为表在RAM中保留一定的内存空间。保留的空间保持不变且不可移动,例外是脚本编写者不用关心的实现细节。任何你为表分配的变量

a = {};
b = { c = {a} }

只是内存中表的指针。一个指针占据32位或64位,仅此而已。每当你传递表的时候,只复制那64位。每当你在表中查询表的时候:

return b.c[1]

计算机按照存储在b中的指针,找到RAM中的表对象,在其中查询键"c",获取另一个表的指针,在其中查询键"1",然后返回指向表a的指针。简单的指针跳跃,相当于算术运算的工作负载。

每个函数都有关联的表_ENV,任何变量查找

return a

实际上是查询该表

return _ENV.a

如果是局部变量,则存储在_ENV中。

如果没有_ENV中给定名称的变量,则查询全局变量,这些实际上存在于顶级表中,即脚本的根函数的_ENV(它是加载和执行脚本的requiredofile函数)。 通常,在任何其他_ENV中都存储对全局表的链接作为_G。因此,对于全局变量的访问

return b

实际上像这样

return _ENV.b or _ENV._G.b

因此,它比1个跳转需要3个指针跳转。 这里是一些复杂的例子,这应该给你在工作量上有所体会:

%运行这个独立Lua解释器
local depth = 100 --链中有多少指针
local q = {};--一张表
local a = {};--指针链的起点
local b = a;--中间变量
for i = 1,depth do b.a = {} b = b.a end; --设置链
local t = os.clock();
print(q)
print(os.clock() - t);--执行上一行的时间
t = os.clock(); --开始指针链遍历
b = a
while b.a do b = b.a end
print(b)
print(os.clock() - t)--指针遍历的时间

当指针链约为100个元素时,系统负载波动可能会导致第二个时间较小。仅当你将depth更改为数千个中间指针时,直接访问才变得显着更快。

请注意,每当查询未初始化的变量时,会执行所有3个跳转。

2017-04-13 21:31:31
用户3455883
用户3455883

全局变量

全局变量存储在保留表 _G 中(您可以随时检查其内容),但避免使用全局变量是良好的编程实践。

除非有非常好的理由,否则您的表 input 应该也是局部的。

引用自 Lua 编程

尽可能使用局部变量是良好的编程风格。局部变量可以帮助您避免在全局环境中添加不必要的名称。此外,访问局部变量比访问全局变量更快。

2017-04-13 22:08:36