原文:PCRE Performance Project

PCRE性能优化

简介

PCRE-sljit项目的目的是提高pcre 库的模式匹配速度。

该项目通过使用sljit来完成的,sljit是一个即时(JIT)编译库, 用于从pcre_compile()生成的内部字节码表示转换机器码。

PCRE-sljit在通用模式上提供了与基于DFA的引擎(如re2)相似的匹配速度,但仍然保持PERL兼容性。

该功能已经作为PCRE 8.20及以上版本的一部分发布,JIT8.32中得到了很大的改进,并且引入了一个原生的接口。

关于性能优化

只有在匹配正则表达式占总运行时至少4-5%的情况下,PCRE-JIT才会对您有所帮助。

否则,由于二进制布局的改变,可能不会有任何性能提高(或者会看到性能下降)

不幸的是,由于CPU缓存布局、分支预测机制等原因,插入nops可以增加或减少最多可达3%的程序运行时间,。

在人为干预下,运行时间的变化幅度可能更大(例如±50%)。当任何函数被修改时,即使改变很小,它也会影响整个二进制布局, 因为其他函数的入口偏移量也会被改变(特别是那些被链接器放在可执行文件中该函数之后的函数)。 因此,当匹配正则表达式的比例非常低时,在使用PCRE-JIT时,您可能会遇到性能的轻微下降。

Usage

TODO

Motivation

工作原理

Why is it faster?

编译时开销

决定何时使用或不使用JIT编译是一个重要的问题。 由于JIT是一种重量级优化,我们永远不应该忘记编译时间开销。 因此,如果对较小的输入只使用一次编译表达式,那么总运行时可能更大。

以下值是在Intel 2.67GHzGCC 4.4.5 64位模式下测量的 注意:ns表示纳秒(10的-9次幂),Int类型。

总结

JIT编译是一项强大的技术,它能够加速解释执行: Java、JavaScript、ActionScript(使用NanoJIT)或正则表达式引擎。

Copyright © weiliang-ms 2021 all right reserved,powered by Gitbook本书发布时间: 2024-05-30 16:49:59

results matching ""

    No results matching ""