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)或正则表达式引擎。