Hello! 2013/7/24 Napoléon: > 1.开启pcre-jit后,使用ngx.re.match和直接使用sregex库相比,哪种性能更好点? 这取决于你的具体用法。首先需要明确下面几点: 1. PCRE 是回溯引擎,sregex 是非回溯引擎(即基于真正的 NFA 算法) 2. sregex 支持分数据块的严格不缓冲的流式匹配,而 PCRE 只支持全缓冲方式的匹配,没有流式处理的支持。 一般地: 1. 如果正则属于病态正则,则 sregex 很可能要比 PCRE 性能更好,因为基于真正的 NFA 算法的引 擎,其最坏时间复杂度总是为 O(n),其中 n 为输入字符串的长度,并假设正则是固定的。而对于病态正则,回溯引擎的时间复杂度是指数级别的。 2. 如果正则属于非病态正则,则 PCRE JIT 的性能目前显著高于 sregex,因为 sregex 还是一个很年轻的项目,还有许多重要的优化工作没有做。 3. 如果你需要支持严格的流式正则匹配或替换,则 sregex 是唯一选择,因为 PCRE 这样的回溯引擎是不可能真正支持这种应用场景的。 > 2.我在编译openresty的时候--with-pcre-jit,在使用ngx.re.match时,option还需要指定为“j”? > 对此我有几点说明: 1. 你在编译 openresty 的时候指定 --with-pcre-jit 只影响 nginx 核心中开启 PCRE 模式,并不会影响到 ngx_lua 模块中的 ngx.re API,因为 ngx.re API 需要在调用时指定 j 正则选项。 2. 即使你在 nginx 一侧开启了 PCRE JIT 模式,但真正让 JIT 生效,还需要你在编译 PCRE 的时候 指定 --enable-jit 选项(PCRE 默认是禁用 JIT 的话)。更多细节可以参考 PCRE 的官方手册:http://www.pcre.org/pcre.txt 3. 你在 ngx.re.match 等调用中指定 j 正则选项的时候应当总是同时指定 o 选项,以启用正则编译缓存。你肯定不会希望每次进行正则匹配时都反复 JIT 编译你的正则,毕竟 JIT 编译的过程本身是高代价操作。更多细节可以参考 http://wiki.nginx.org/HttpLuaModule#ngx.re.match Regards, -agentzh
Hello! 2013/7/25 Yichun Zhang (agentzh): > 对此我有几点说明: > > 1. 你在编译 openresty 的时候指定 --with-pcre-jit 只影响 nginx 核心中开启 PCRE 模式,并不会影响到 > ngx_lua 模块中的 ngx.re API,因为 ngx.re API 需要在调用时指定 j 正则选项。 > > 2. 即使你在 nginx 一侧开启了 PCRE JIT 模式,但真正让 JIT 生效,还需要你在编译 PCRE 的时候 指定 > --enable-jit 选项(PCRE 默认是禁用 JIT 的话)。更多细节可以参考 PCRE > 的官方手册:http://www.pcre.org/pcre.txt > 另外,可以考虑使用我的 Nginx Systemtap Toolkit 中的 ngx-pcrejit 这个工具实时确认 PCRE JIT 是否真的在你的 nginx 进程中正确生效了: https://github.com/agentzh/nginx-systemtap-toolkit#ngx-pcrejit 同时,ngx-pcre-stats 工具也是实时分析正则的在线执行性能的很有用的工具: https://github.com/agentzh/nginx-systemtap-toolkit#ngx-pcre-stats Best regards, -agentzh