最近一直在做openresty相关开发,使用lua优化,优化了几次,发现最大的优化是table的优化。
table优化的大原则是尽量少创建表,表创建多了毕竟耗性能。这里的创建,指新创建和扩表引起的创建。在往table插入数据的过程中,如果table不够用,会扩大两倍,所以,一个1030项数据,会经过十次扩表,非常消耗性能。
方法一,代码层面重用表
原始代码:
for i, 100 do
local a = {}
a.num = i
a.result = "test"
ngx.say(table.concat(a))
end
里面有多次创建表,但其实可以补创建那么多次,改为
local a = {}
for i, 100 do
a.num = i
a.result = "test"
ngx.say(table.concat(a))
end
方法二,使用table.new
table.new()是luajit新加的功能,可以在创建table的时候,指定table的大小,避免扩表操作
local new_tab = require "table.new"
local t = new_tab(100, 0)
for i = 1, 100 do
t[i] = i
end
方法三,使用table 池
table.new对应的有一个table.clear函数,用于清空表,所以可以封装一个table池,循环使用这些table,减少table创建
local tablepool = require "tablepool"
local tablepool_fetch = tablepool.fetch
local tablepool_release = tablepool.release
local pool_name = "some_tag"
local function do_sth()
local t = tablepool_fetch(pool_name, 10, 0)
-- -- using t for some purposes
tablepool_release(pool_name, t)
end