探究Openresty中ngx.re与Lua string.re两种正则的选择

天翼云开发者社区
• 阅读 3

本文分享自天翼云开发者社区《探究Openresty中ngx.re与Lua string.re两种正则的选择》.作者:王****淋

0.背景

openresty中存在2套正则API,即ngx.re与 lua语言的string库,都可以实现正则匹配查找等功能,那么,这2个API有什么区别,又如何选择呢?

1. 性能测试

1.1 简单loop测试

a) 短字符串&正则串

local http_range = 'bytes=10-65535'
local string_re_p = '^bytes=([%d]*)%-([%d]*)$'
local ngx_re_p    = '^bytes=([\\d]*)?\\-([\\d]*)$'
local loop = 1000000

local t0 =  get_t()
for i = 1, loop do
    local _, _ = string_match(http_range, string_re_p)
end

local t1 =  get_t()
for i = 1, loop do
    local m, err = ngx_re_match(http_range, ngx_re_p, "jo")
end
local t2 =  get_t()

Result: 0.247 vs. 0.32

b) 长字符串&复杂正则串

local http_range = 'dsfds65465fwef bytes=12345757860-4465458586465 ewfsd65sd4fg65fsd'
local string_re_p = '.*bytes=([%d]*)%-([%d]*) .+'
local ngx_re_p    = '.*bytes=([\\d]*)?\\-([\\d]*) .+'
local loop = 1000000

Result: 1.16 vs. 0.526

由测试结果可以看出,对于字符串/正则规则越复杂,ngx-re的性能是有优势的

1.2. 加入jit扰动

a) 对照组:ipairs不破坏jit (短串正则)

local http_range = 'bytes=10-65535'
local string_re_p = '^bytes=([%d]*)%-([%d]*)$'
local ngx_re_p    = '^bytes=([\\d]*)?\\-([\\d]*)$'
local loop = 1000000

local t0 =  get_t()
for i = 1, loop do
    for k, v in ipairs({1,2}) do end
    local _, _ = string_match(http_range, string_re_p)
end

local t1 =  get_t()
for i = 1, loop do
    for k, v in ipairs({1,2}) do end
    local m, err = ngx_re_match(http_range, ngx_re_p, "jo")
end
local t2 =  get_t()

jit-on: 0.369 - 0.326 jit-off: 0.38 - 3.265

b) pairs 破坏jit (短串正则)

local http_range = 'bytes=10-65535'
local string_re_p = '^bytes=([%d]*)%-([%d]*)$'
local ngx_re_p    = '^bytes=([\\d]*)?\\-([\\d]*)$'
local loop = 1000000

local t0 =  get_t()
for i = 1, loop do
    for k, v in pairs({a=1,b=2}) do end
    local _, _ = string_match(http_range, string_re_p)
end

local t1 =  get_t()
for i = 1, loop do
    for k, v in pairs({a=1,b=2}) do end
    local m, err = ngx_re_match(http_range, ngx_re_p, "jo")
end
local t2 =  get_t()

jit-off: 0.395 - 3.216 jit-on: 0.394 - 1.04

c) pairs + 长复杂串

local http_range = 'dsfds65465fwef bytes=12345757860-4465458586465 ewfsd65sd4fg65fsd'
local string_re_p = '.*bytes=([%d]*)%-([%d]*) .+'
local ngx_re_p    = '.*bytes=([\\d]*)?\\-([\\d]*) .+'
local loop = 1000000
jit-on: 1.31 - 1.30
jit-off: 1.307 - 2.94

超长串 + jit-on:

local http_range = 'dsfds6546vsdvsdfdsfsdfsdfwaasdasdasdas5fwef bytes=12354345345345757860-4465453453453453453453453458586465 ewfsd65safdknsalk;nlkasdnflksdajfhkldashjnfkl;ashfgjklahfg;jlsasd4fg65fsd'

结果: 2.775 - 1.739

1.3测试结果汇总

string.match ngx.re.match 备注
短串正则 0.247 秒 0.32 秒 jit-hit
短串正则 带ipirs 0.369 0.326 jit-hit
短串正则 带pairs 0.394 1.04
长串正则 带pairs 2.775 1.739
短串正则 带pairs+jit-off 0.395 3.216 jit-off
短串正则 带ipairs+jit-off 0.38 3.265 jit-off
### 2.结论
由测试结果可知:
1)在一般情况下,nginx-re正则库更能适应复杂字符串与复杂正则规则的情况,一般情况下比较推荐使用
2)在极简单字符串的情况下,二者差别不大,string正则稍带优势,可以按照方便的写法来写;
3)nginx-re正则受JIT的影响更大,在关闭jit或使用pairs等情况下,可能会有拖累;
点赞
收藏
评论区
推荐文章
Springfox与SpringDoc——swagger如何选择(SpringDoc入门)
本文分享自天翼云开发者社区@《》,作者:才开始学技术的小白0.引言之前写过一篇关于swagger(实际上是springfox)的使用指南(https://www.ctyun.cn/developer/article/371704742199365),涵盖了
Stella981 Stella981
4年前
Regex 正则表达式入门
!在这里插入图片描述(https://imgblog.csdnimg.cn/20200502170142100.jpg?pic_center)0,什么是正则表达式正则表达式(RegularExpression简写为Regex),又称为规则表达式,它是一种强大的文本匹配模式,其用于在字符串中查找匹配符
lua-zlib模块安装与使用
本文分享自天翼云开发者社区《》.作者:luckylywluazlib包用于nginx上对gzip数据进行解压缩,可将luazlib编译成一个动态链接库zlib.so,便于lua引用。github:https://github.com/brimworks/l
CDN与域名ICP备案的关系浅谈
本文分享自天翼云开发者社区《》.作者:江禄本文介绍CDN与域名ICP备案的关系以及如何进行域名ICP备案。一、CDN与域名ICP备案的关系CDN与域名ICP(InternetContentProvider)备案之间存在着密切的关系,这种关系主要体现在互联网
openresty共享内存的使用
本文分享自天翼云开发者社区《》.作者:王兰在OpenResty中,ngx.shared用于访问共享内存区域,这在处理高并发请求时非常有用。以下是一些常见的使用场景和示例代码。首先,需要在Nginx配置文件中定义一个共享内存区域。例如,在http块中添加以下
perl正则语法总结
本文分享自天翼云开发者社区《》.作者:李壮一、介绍正则表达式(regularexpression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。Perl语言的正则表达式功能非常强大
从random随机数看验证码重复数字
本文分享自天翼云开发者社区《》.作者:王淋推导:1.有6个不同数字(0个重复数字:111111):$$p(6)C10^66!\div10^6$$2.有5个不同数字(某个数字重复了2次:11112):$$p(5)(\fracC10^5C5^
警惕大数据处理中的“检查者悖论”
本文分享自天翼云开发者社区《》.作者:王淋什么是检查者悖论:观察的角度不同,得出的统计结论也不同。有时又称为"候车悖论","等待时间悖论"为了形象说明,我们设计了一种模拟场景:班级人数统计,来用实例说明这个问题模拟场景:班级人数统计小明与小华要完成一个任务
Lua:善用luarocks管理公共库
本文分享自天翼云开发者社区《》.作者:王淋什么是LuarocksLuarocks是一个Lua包管理器,基于Lua语言开发,提供一个命令行的方式来管理Lua包依赖、安装第三方Lua包等,社区比较流行的包管理器之一Python具有PIP,Ruby具有Gems,
openresty中使用ngx.sleep(0)防止worker进程阻塞
本文分享自天翼云开发者社区《》.作者:小谢不用谢1.ngx.sleep(0)的工作原理在OpenResty中,ngx.sleep(0)函数的作用是让当前的Lua协程主动放弃CPU执行权,以便Nginx能够及时处理其他并发请求和I/O操作。具体来说,调用ng
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
1.0k
粉丝
16
获赞
40