400-100-9516
news
技术分享

站内搜索

技术分享|如何让正则表达式性能提升40倍
2021-05-14 357 技术分享

数据风险全知道

PCRE与Hyperscan使用对照

PCRE(全称Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式) 是一个用C语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE是一个轻量级的函数库,比Boost之类的正则表达式库小得多。PCRE十分易用,同时功能也很强大,性能超过了POSIX正则表达式库和一些经典的正则表达式库。

因为正则表达式的易用性及功能强大,PCRE被广泛使用在许多开源软件之中,最著名的莫过于Apache HTTP服务器和PHP脚本语言、R脚本语言,此外,正如从其名字所能看到的,PCRE也是perl语言的缺省正则库。

undefined

随着数据量的增多,以及正则表达式种类的新增,以至于再使用过程当中随着数据量的增长,处理性能却线性递减的问题也凸显出来;因此PCRE的性能优化版本也相继产生,如PCRE-DFA,PCRE-JIT等。

在此种情况下Hyperscan应用而生。Hyperscan是一款来自于Intel的高性能的正则表达式匹配库。它是基于X86平台以PCRE为原型而开发的,并以BSD许可开源在https://github.com/intel/hyperscan。

undefined

 Hyperscan是一款高性能多正则同时匹配的C-API库,Hyperscan采用混合元数据技术以流处理的方式处理大量的正则表达式(Hyperscan is a high-performance multiple regex matching library available as open source with a C API. Hyperscan uses hybrid automata techniques to allow simultaneous matching of large numbers of regular expressions across streams of data)。

undefined

Hyperscan运行原理介绍

通过将正则表达转换为一系列字符及有限状态机(graph decomposition that translates regular expression matching into a series of string and finite automata matching)

通过使用SIMD指令对字符及有限状态机的匹配进行加速(accelerates both string and finit automata matching using SIMD operation)

undefined

 

undefined

undefined

 

PCRE与Hyperscan性能对照

单条pattern分别匹配 from A comparison of regex engines(2017),测试如下:

undefined

undefined

 

从测试结果来看,Hyperscan处理性能占据了明显优势;同时hscan的运行性能是pcre性能的42.13倍(12626.7/299.7=42.13)。不过,Hyperscan所能支持的正则表达式是PCRE的子集;比如断言,前相匹配等表达式不能支持;所以对于PCRE的应用直接切换到Hyperscan中需要一定时间的改造和适应。

全知数据识别系统,在设计时就考虑到了PCRE及Hyperscan的兼容性,所以优先使用Hyperscan所能支持的方式对正则表达式进行书写;从而大幅提升系统的处理性能。

undefined

- END -

如有侵权,请联系删除

 

在线客服