PCRE性能优化
简介
PCRE-sljit
项目的目的是提高pcre 库的模式匹配速度。
该项目通过使用sljit
来完成的,sljit
是一个即时(JIT)编译库,
用于从pcre_compile()
生成的内部字节码表示转换机器码。
PCRE-sljit
在通用模式上提供了与基于DFA
的引擎(如re2
)相似的匹配速度,但仍然保持PERL
兼容性。
该功能已经作为PCRE 8.20
及以上版本的一部分发布,JIT
在8.32
中得到了很大的改进,并且引入了一个原生的接口。
关于性能优化
只有在匹配正则表达式占总运行时至少4-5
%的情况下,PCRE-JIT
才会对您有所帮助。
否则,由于二进制布局的改变,可能不会有任何性能提高(或者会看到性能下降)
不幸的是,由于CPU
缓存布局、分支预测机制等原因,插入nops
可以增加或减少最多可达3%
的程序运行时间,。
在人为干预下,运行时间的变化幅度可能更大(例如±50%)。当任何函数被修改时,即使改变很小,它也会影响整个二进制布局,
因为其他函数的入口偏移量也会被改变(特别是那些被链接器放在可执行文件中该函数之后的函数)。
因此,当匹配正则表达式的比例非常低时,在使用PCRE-JIT
时,您可能会遇到性能的轻微下降。
Usage
TODO
Motivation
工作原理
Why is it faster?
编译时开销
决定何时使用或不使用JIT
编译是一个重要的问题。
由于JIT
是一种重量级优化,我们永远不应该忘记编译时间开销。
因此,如果对较小的输入只使用一次编译表达式,那么总运行时可能更大。
以下值是在Intel 2.67GHz
和GCC 4.4.5 64
位模式下测量的
注意:ns
表示纳秒(10的-9次幂),Int
类型。
总结
JIT
编译是一项强大的技术,它能够加速解释执行: Java、JavaScript、ActionScript
(使用NanoJIT)或正则表达式引擎。