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
總結
以上是生活随笔為你收集整理的boost pcre Greta RE2 正则表达式性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IE提示“存储空间不足,无法完成此操作”
- 下一篇: 最好的放大镜