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

摘要:
最近一直在做openresty相关开发,使用lua优化,优化了几次,发现最大的优化是table的优化。table优化的大原则是尽量少创建表,表创建多了毕竟耗性能。这里的创建,指新创建和扩表引起的创建。在往table插入数据的过程中,如果table不够用,会扩大两倍,所以,一个1030项数据,会经过十次扩表,非常消耗性能。

最近一直在做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

免责声明:文章转载自《openresty性能优化 -- table相关优化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java多线程:向线程传递参数的三种方法TP5实现邮件发送(PHP 利用QQ邮箱发送邮件「PHPMailer」)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

lua语言(2):闭包、模式匹配、日期、编译、模块

lua中的闭包 在lua语言中,函数是严格遵循词法定界(lexical scoping)的第一类值(first-class value)。 第一类值意味着lua语言中的函数与其它常见类型的值(例如数值和字符串)具有同等权限:一个程序可以将某个函数保存到变量、或表中,也可以将函数作为参数传递给另外一个函数,还可以将函数作为某个函数的返回值返回。 词法定界意味...

Nginx与Lua

Nginx与Lua   最先将Nginx,Lua组合到一起的是OpenResty,它有一个ngx_lua模块,将Lua嵌入到了Nginx里面;随后Tengine也包含了ngx_lua模块。至于二者的区别:OpenResty是Nginx的Bundle;而Tengine则是Nginx的Fork。值得一提的是,OpenResty和Tengine均是国人自己创建...

三篇文章了解 TiDB 技术内幕——说计算

在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句。 假设我们有这样一个表的定义: CREATE TABLE User { ID int, Name varchar(20), Role varchar(20), Age int, PRIMARY KEY (...

R实战 第十篇:列联表和频数表

列联表是观测数据按两个或更多属性(定性变量)分类时所列出的频数分布表,它是由两个以上的变量进行交叉分类的频数分布表。交互分类的目的是将两变量分组,然后比较各组的分布状况,以寻找变量间的关系。 按两个变量交叉分类的,该列联表称为两维列联表;若按3个变量交叉分类,所得的列联表称为3维列联表,依次类推。一维列联表就是频数分布表。频数就是各个分组中属性出现的次数。...

XLua热更新用法全流程总结(所有容易出问题的点)

Xlua热更新流程总结 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!记录 Xlua 完成热更新流程为新手节省宝贵的时间,避免采坑! Chinar 教程效果: 1 Description —— 描述...

HTML标签CSS默认值研究

   最近写css的时候,发现在div元素里面添加ul元素后发现,ul列表在div里面距离最上方总是有一段空行,当时很奇怪,以为是哪个css出了问题,就把css去掉了,发现问题依旧,然后就查了一下发现html标签在不同浏览器里面是有默认的css样式的,要去掉默认样式,在样式表里添加 *{margin:0;padding:0;}即可,同时找到一个很有用的文档...