把我的本地函数变为全局函数,这样做是不是多此一举?
2017-4-13 16:29:9
收藏:0
阅读:65
评论:2
我读过一篇文章,说把大部分的函数保持为本地函数而不是全局函数,可以使程序运行得更快更好。
所以我这样写:
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. 在函数名前面,这样看起来很整齐,如果这样不是不良的编码习惯的话,我可能还是会保留它的。
点赞
用户3455883
全局变量
全局变量存储在保留表 _G 中(您可以随时检查其内容),但避免使用全局变量是良好的编程实践。
除非有非常好的理由,否则您的表 input 应该也是局部的。
引用自 Lua 编程:
尽可能使用局部变量是良好的编程风格。局部变量可以帮助您避免在全局环境中添加不必要的名称。此外,访问局部变量比访问全局变量更快。
2017-04-13 22:08:36
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

重新发明满足个人需求的轮子是Lua的核心。创造者在他的书中这里中描述了你所描述的方法是有效的。
在Lua中,所有都存储在表中。 "更快"的本地函数(以及更快的本地变量)来自于全局变量和upvalue查找的方式。 下面是一个相关的更详细的解释速度的引用,它发生在一个游戏的论坛中. 除此之外,由于代码的干净和错误防护,建议使用局部变量。
在lua中,使用{}创建表,这个运算符为表在RAM中保留一定的内存空间。保留的空间保持不变且不可移动,例外是脚本编写者不用关心的实现细节。任何你为表分配的变量
只是内存中表的指针。一个指针占据32位或64位,仅此而已。每当你传递表的时候,只复制那64位。每当你在表中查询表的时候:
return b.c[1]计算机按照存储在
b中的指针,找到RAM中的表对象,在其中查询键"c",获取另一个表的指针,在其中查询键"1",然后返回指向表a的指针。简单的指针跳跃,相当于算术运算的工作负载。每个函数都有关联的表
_ENV,任何变量查找return a实际上是查询该表
return _ENV.a如果是局部变量,则存储在
_ENV中。如果没有
_ENV中给定名称的变量,则查询全局变量,这些实际上存在于顶级表中,即脚本的根函数的_ENV(它是加载和执行脚本的require或dofile函数)。 通常,在任何其他_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个跳转。