Lua代码优化点记录
1、尽量少用..拼接字符串
function myTest()
local num = 50000
local str = "abc"
collectgarbage("collect")
local start = collectgarbage("count")
local a = os.clock()
local temp = ""
for i = 1, num do
temp = temp .. str
end
local b = os.clock()
print("Time1---: ", b - a)
print("-------------------GC1---: ", collectgarbage("count") - start)
collectgarbage("collect")
local start = collectgarbage("count")
local a = os.clock()
local t = {}
for i = 1, num do
table.insert(t, str)
end
local b = os.clock()
local temp = table.concat(t)
print("Time2---: ", b - a)
print("-------------------GC2---: ", collectgarbage("count") - start)
collectgarbage("collect")
local start = collectgarbage("count")
local a = os.clock()
local format = "%s%s"
local temp = ""
for i = 1, num do
temp = string.format(format, temp, str)
end
local b = os.clock()
print("Time3---: ", b - a)
print("-------------------GC3---: ", collectgarbage("count") - start)
end
打印结果:
所以推荐用table.concat
2、一个经常使用的全局变量,可以先加载到一个局部变量中
function myTest2()
local num = 1000000000
local a = os.clock()
for i = 1, num do
math.sin(i)
end
print("-------------------Time1: ", os.clock() - a)
local sin = math.sin
local a = os.clock()
for i = 1, num do
sin(i)
end
print("-------------------Time2: ", os.clock() - a)
local a = os.clock()
for i = 1, num do
Const.sin(i) -- Const = {sin = math.sin}
end
print("-------------------Time3: ", os.clock() - a)
end
打印结果:
以前傻傻的以为大佬们把全局变量赋值给局部变量是为了少打几个字!!!!!像tolua的Vector3源码这样。
获取全局变量比获取局部变量多了一个重定向的过程,多了一条GETGLOBAL指令!
3、创建大量的小表时
function myTest3()
local num = 10000000
local a = os.clock()
for i = 1, num do
local temp = {}
temp[1] = 1
temp[2] = 2
temp[3] = 3
end
print("-------------------Time1: ", os.clock() - a)
local a = os.clock()
for i = 1, num do
local tmep = {1, 2, 3}
end
print("-------------------Time2: ", os.clock() - a)
end
打印结果:
第一种写法有个扩容过程,插入三个值有三次扩容过程(第一次容量变成1,第二次变成2,第三次变成4,容量按2的次幂来扩大),所以创建多个小表的时候推荐第二种写法
4、.和:的使用
function myTest4()
local num = 100000000
t = {abc = 1}
function t.test(i)
t.abc = i
local temp = t.abc
end
function t.test2(self, i)
self.abc = i
local temp = self.abc
end
function t:test3(i)
self.abc = i
local temp = self.abc
end
collectgarbage("collect")
local start = collectgarbage("count")
local a = os.clock()
for i = 1, num do
t.test(i)
end
local b = os.clock()
print("Time1---: ", b - a)
print("-------------------GC1---: ", collectgarbage("count") - start)
collectgarbage("collect")
local start = collectgarbage("count")
local a = os.clock()
for i = 1, num do
t.test2(t, i)
end
local b = os.clock()
print("Time2---: ", b - a)
print("-------------------GC2---: ", collectgarbage("count") - start)
collectgarbage("collect")
local start = collectgarbage("count")
local a = os.clock()
for i = 1, num do
t:test3(i)
end
local b = os.clock()
print("Time3---: ", b - a)
print("-------------------GC3---: ", collectgarbage("count") - start)
end
运行结果:
如果要使用调用对象的话尽量使用冒号(:)
test2方法和test3方法看起来一样的,实际上实现test2比实现test3多一条指令,调用test2取到self需要gettable和getglobal这两条指令,而test3只用self一条指令就可以了!
5、从尾部插入table
function myTest5()
local num = 10000000
collectgarbage("collect")
local t = {}
local insert = table.insert
local start = collectgarbage("count")
local a = os.clock()
for i = 1, num do
insert(t, i)
end
local b = os.clock()
print("Time1---: ", b - a)
print("-------------------GC1---: ", collectgarbage("count") - start)
collectgarbage("collect")
local t = {}
local start = collectgarbage("count")
local a = os.clock()
for i = 1, num do
t[#t + 1] = i
end
local b = os.clock()
print("Time2---: ", b - a)
print("-------------------GC2---: ", collectgarbage("count") - start)
end
运行结果:
推荐使用t[#t + 1] = i这种方式