这是一个旧版本的
LuaTips于2006-03-07 22:27:10.
Lua 的 5.1 版本已经正式发布。现在,我们应该把全部讨论放在这个版本上。
应该尽量使用 local 变量而非 global 变量。这是
Lua 初学者最容易犯的错误。global 变量实际上是放在一张全局的 table 里的。global 变量实际上是利用一个 string (变量名作 key) 去访问这个 table 。虽然
Lua5 的 table 效率很高 ,但是相对于 local 变量,依然有很大的效率损失。local 变量是直接通过
Lua 的堆栈访问的。有些 global 变量的访问是不经意的,比如我们有双重循环操作一个迭代的 table:
for k1,v1 in pairs(tbl) do
for k2,v2 in pairs(v1) do
...
end
end
这里,pairs 其实是一个全局变量应用的函数。如果我们这样做:
do
local pairs=pairs
for k1,v1 in pairs(tbl) do
for k2,v2 in pairs(v1) do
...
end
end
end
效率会稍微提高一些。如果是单层循环,这样做就没有意义。因为 for ... in 循环中的 pairs 这个函数只会被调用一次,而不是每次循环都去调。我们的原则其实是,被多次读取的 global 变量,都应该提取出来放到 local 变量中。
应该尽量用 do ... end 减少函数对 local 变量的可视范围。当定义一个 function 的时候,这个 function 向上所有可见的范围的 local 变量都会被作为 upvalue 和 function 本身绑定在一起,成为一个 closure 。太多的 local 变量虽然几乎没有速度损失,但是会带来额外的内存消耗。过多的内存消耗会过早引起 gc 。