Lua性能优化

一、前言

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值