openresty效能優化 -- table相關優化
阿新 • • 發佈:2021-01-11
最近一直在做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