openresty性能优化 -- table相关优化

最近一直在做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
posted @ 2021-01-10 21:27  抟九  阅读(948)  评论(0编辑  收藏  举报