通过让我的本地函数全局化,我基本上做了额外的工作吗?

时间:2017-04-13 16:29:09

标签: lua

我读到,将大多数功能保持在本地而不是全局是更快更好的 所以我这样做:

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

然后在input.lua例如:

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

whereLetter,numpadCheck等是该文件的本地函数。 然后我调用这样的函数:

input.isLetter(key)

现在,我的问题是:我是否用这个重新发明轮子?是不是全局函数存储在lua表中?我喜欢它的输入方式。在函数名称之前,保持它的整洁,所以如果它不是一个糟糕的编码实践,我可以保留它。

2 个答案:

答案 0 :(得分:4)

根据您的个人需求重新设计轮子是lua的核心。 您描述的方法被lua creator自己在他的书here中描述为有效的方法。

Lua中的

一切存储在一个表中。 "更快"本地函数(以及更快的局部变量)来自于查找全局变量和upvalues的方式。 在该行的下方,引用了游戏论坛.中发生的关于速度的更详细解释的相关部分的引用。 除此之外,由于代码的清洁和防错,建议当地人。

在lua中,使用{}创建一个表,该运算符在表的ram中保留一定量的内存。保留空间保持不变且不可移动,例外是脚本编写者不应该关注的实现细节。 您将表分配给

的任何变量
a={}; 
b={ c={a} }

只是指向内存中表的指针。指针占用32位或64位并且就是它。 每当你传递表时,只复制那些64位。 每当您查询表中的表时:

return b.c[1]

计算机跟随存储在b中的指针,在ram中找到一个表对象,查询它的关键字" c",将指针指向另一个表,查询关键字" 1& #34;然后返回指向表a的指针。只是一个简单的指针跳跃,工作量与算术相同。

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

return a

实际上是对该表的查询

return _ENV.a

如果变量是本地变量,则存储在_ENV

如果_ENV中没有给定名称的变量,则查询全局变量,这些变量实际驻留在顶级表中,脚本的根函数的_ENV (加载并执行脚本的是requiredofile函数。 通常,指向全局表的链接存储在任何其他_ENV _G中。所以访问全局变量

return b

实际上就像是

return _ENV.b or _ENV._G.b

因此它大约有3个指针跳转而不是1个。 这是一个复杂的例子,可以让您深入了解暗示的工作量:

%RUN THIS IN STANDALONE LUA INTERPRETER
local depth=100--how many pointers will be in a chain
local  q={};--a table
local a={};--a start of pointer chain
local b=a;  -- intermediate variable
for i=1,depth do b.a={} b=b.a end;  --setup chain
local t=os.clock(); 
print(q)  
print(os.clock()-t);--time of previous line execution 
t=os.clock(); --start of pointer chain traversal
b=a 
while b.a do b=b.a end 
print(b) 
print(os.clock()-t)--time of pointer traversal

当指针链大约是100个元素时,系统负载波动实际上可能导致第二次更小。只有当您将depth更改为数千个以上的中间指针时,直接访问才会显着加快。

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

答案 1 :(得分:2)

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

除非有充分理由不这样做,否则您的表格input也应为local

来自Programming in Lua

  

尽可能使用局部变量是一种很好的编程风格。局部变量可帮助您避免使用不必要的名称来混淆全局环境。此外,对局部变量的访问速度快于全局变量。