一、前言
Lua 是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏。
我认为最好的方式是在首次编写的时候按照最佳实践去写出高性能的代码,而不是编写了一堆垃圾代码后,再考虑优化。相信工作后大家都会对事后的优化的繁琐都深有体会。
二、使用 local
在代码运行前,Lua 会把源码预编译成一种中间码,类似于 Java 的虚拟机。这种格式然后会通过 C 的解释器进行解释,整个过程其实就是通过一个 while 循环,里面有很多的 switch...case 语句,一个 case 对应一条指令来解析。
自 Lua 5.0 之后,Lua 采用了一种类似于寄存器的虚拟机模式。Lua 用栈来储存其寄存器。每一个活动的函数,Lua 都会其分配一个栈,这个栈用来储存函数里的活动记录。每一个函数的栈都可以储存至多 250 个寄存器,因为栈的长度是用 8 个比特表示的。
有了这么多的寄存器,Lua 的预编译器能把所有的 local 变量储存在其中。这就使得 Lua 在获取 local 变量时其效率十分的高。
举个栗子: 假设 a 和 b 为 local 变量,a = a + b 的预编译会产生一条指令:
; a 是寄存器 0 b 是寄存器 1
ADD 0 0 1
但是若 a 和 b 都没有声明为 local 变量,则预编译会产生如下指令:
GETGLOBAL 0 0; get a
GETGLOBAL 1 1; get b
ADD 0 0 1; do add
SETGLOBAL 0 0; set a
所以你懂的:在写 Lua 代码时,你应该尽量使用 local 变量。
以下是几个对比测试,你可以复制代码到你的编辑器中,进行测试。
a = os.clock()
for i = 1, 10000000 do
local x = math.sin(i)
end
b = os.clock()
print(b - a)-- 1.113454
把 math.sin 赋给 local 变量 sin:
a = os.clock()
local sin = math.sin
for i = 1, 10000000 do
local x = sin(i)
end
b = os.clock()
print(b - a)--0.75951
直接使用 math.sin,耗时 1.11 秒;使用 local 变量 sin 来保存 math.sin,耗时 0.76 秒。可以获得 30%的效率提升!
三、关于表(table)
表在 Lu