boost pcre Greta RE2 正则表达式性能测试

算法:

a depth-first search of the pattern tree: pcre 称其为 NFA ,一条路径,需回溯,反复遍历输入输入字符串。

a breadth-first search of the tree: pcre 称其为 DFA ,Google RE2 称其为 Thompson NFA ,所有路径,不需回溯,输入字符串只需遍历一次。类似 NFA 转 DFA 算法 Powerset construction 的过程。

 

DFA 不需要回溯,理论性能比 NFA 要强,但缺点是不能实现 back references,这点确实得到了 Google RE2 的印证。但奇怪的是 pcre 文档说自己的 DFA 实现比 NFA 实现要慢。同时 pcre 的 DFA 不支持 capturing parentheses (小括号捕获),导致大多数测试无法进行,故没有做 pcre DFA 测试。
Google 做 RE2 的另一个重要理由是 NFA 可以陷入递归死循环,导致提供服务的服务器被攻击。 当然大多数的正则库,都能限制递归深度或者非递归的内存用量来解决此问题。
 
测试种类:

GRETA 2.6.4 (递归模式)

GRETA 2.6.4 (非递归)  

Boost regex 1.46.1 (递归模式,windows上栈溢出后自动转换为非递归模式)

Boost regex 1.46.1 ( C++ locale同上,但比较字符采用C++ locale)

PCRE 8.37 ( NFA 递归、 JIT,未测试 DFA  )

Boost Xpressive 1.56.1(Dynamic Xpressive)

Google RE2 (DFA类,但相比 PCRE 的 DFA 其支持匹配括号 capturing parentheses,但不支持 back references)

 

 

总结起来就是 pcre JIT 当之无愧的王者(性能与特性兼顾),DFA 类的 Google RE2 大多数测试都很优秀(特性上够用)。

 

注意:

GRETA已经多年没维护过了,VS2008上编译有个小的地方需要修改。可直接在GCC 3.2上编译,但GCC4 系列无法编译通过(理论上是GCC3.4开始就不能编译了,采用新的解析器,所以模板语法上很多处需要修改)
 
Linux 平台下, posix 库部分测试项,会表现成绩异常优秀( 由于 posix extended 正则能力有限),但不能匹配出预期数量的结果,所以屏蔽这些测试项。

测试方法:

Boost库自带的正则表达式性能测试工具(libs\regex\performance)

 

测试环境:

PC——  Intel Core i5 M560 2.67GHz:

  WinXP i386         VS2003sp1

 

Server—— Intel Xeon X5560 2.8GHz:

  Windows 2003 i386    VS2003sp1

  RHEL 5.5 x64        GCC 4.1

 

Server—— Intel(R) Xeon(R) E5405 @ 2.00GHz

  RHEL 6.4 x64        GCC 4.4           boost 1.56

 

 

测试结果:

 

具体内容见附件 regex_performance.zip

转载于:https://www.cnblogs.com/JesseFang/archive/2011/04/18/2019721.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值