所以我正在阅读Lua 2nd Ed中的编程,我在这里看到了这一段:
尽可能使用局部变量是一种很好的编程风格.局部变量可帮助您避免使用不必要的名称来混淆全局环境.此外,对局部变量的访问比对全局变量的访问更快.
谁能解释为什么会这样?这个"功能"仅在Lua中,还是在其他语言中?(例如C,C++,Java)
我正在查看描述各种提高Lua脚本代码性能的技术的文档,我很震惊需要这样的技巧.(虽然我引用了Lua,但我在Javascript中看到过类似的黑客攻击).
为什么需要进行此优化:
例如,代码
Run Code Online (Sandbox Code Playgroud)for i = 1, 1000000 do local x = math.sin(i) end运行速度比这个慢30%:
Run Code Online (Sandbox Code Playgroud)local sin = math.sin for i = 1, 1000000 do local x = sin(i) end
他们在sin当地重新宣布职能.
为什么这会有所帮助?无论如何,这是编译器的工作.为什么程序员必须完成编译器的工作?
我在Javascript中看到了类似的东西; 所以显然必须有一个非常好的理由说明为什么解释编译器没有完成它的工作.它是什么?
我在Lua环境中反复看到它,我正在摆弄; 人们将变量重新声明为本地变量:
local strfind = strfind
local strlen = strlen
local gsub = gsub
local pairs = pairs
local ipairs = ipairs
local type = type
local tinsert = tinsert
local tremove = tremove
local unpack …Run Code Online (Sandbox Code Playgroud) 创建常见Lua函数的本地副本是否有任何价值print(),pairs()或者ipairs()?
例:
local _print = print
local _pairs = pairs
local _ipairs = ipairs
for i, v in _ipairs(someTable) do
_print(v)
end
Run Code Online (Sandbox Code Playgroud)
我看过一些Lua用这个写的,我想知道这样做是否有任何好处(表现或其他方面)?
可能重复:
为什么要将全局Lua函数设为本地?
在社区的许多lua脚本中,我看到类似于向脚本添加模块的内容:
local module = require("module")
Run Code Online (Sandbox Code Playgroud)
但根据lua-manual,这不是加载模块的方法.模块本身内部有模块名称,所以
require("module")
Run Code Online (Sandbox Code Playgroud)
就像这样使用模块就足够了:module.myfunction().使用local-definition的第一个示例只是将"true"写入module-var - 表示模块已成功加载.
这个问题是,我看到这种加载"本地模块=需要("模块")"在网络的任何地方.来自lua-community的大多数脚本由于此错误而无法正常工作.我也想知道为什么我还没有在网上发现任何相关问题.
接下来的事情是,实际加载模块有时会导致奇怪的错误.例如:我有一个脚本
require("purexml.lua")
Run Code Online (Sandbox Code Playgroud)
比我收到这个错误:
no field package.preload['purexml.lua']
no file './purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua/init.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua/init.lua'
no file './purexml/lua.so'
no file '/usr/local/lib/lua/5.1/purexml/lua.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
no file './purexml.so'
no file '/usr/local/lib/lua/5.1/purexml.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
Run Code Online (Sandbox Code Playgroud)
但这样做很好:
require("purexml")
Run Code Online (Sandbox Code Playgroud)
我错过了一些非常明显的东西吗?我顺便使用Lua 5.1.4 ......