我读到,将大多数功能保持在本地而不是全局是更快更好的 所以我这样做:
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表中?我喜欢它的输入方式。在函数名称之前,保持它的整洁,所以如果它不是一个糟糕的编码实践,我可以保留它。
答案 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
(加载并执行脚本的是require
或dofile
函数。
通常,指向全局表的链接存储在任何其他_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
。
尽可能使用局部变量是一种很好的编程风格。局部变量可帮助您避免使用不必要的名称来混淆全局环境。此外,对局部变量的访问速度快于全局变量。