正则表达式性能:Boost vs. Perl

时间:2009-11-18 23:59:12

标签: c++ regex performance perl

我正在寻找perl和boost正则表达式之间的性能比较 我需要设计一段非常依赖正则表达式的代码,并且可以选择:

  1. 通过boost regex运行
  2. 派遣perl解释器并在perl中完成工作
  3. 我知道perl因其优化的字符串处理而闻名。但是,我找不到性能比较来提升正则表达式库 你知道任何这样的比较吗?
    感谢

7 个答案:

答案 0 :(得分:12)

从您的应用程序中运行Perl解释器的启动成本(通过我假设的系统函数)将超过您使用Perl的正则表达式引擎所获得的任何好处。例外情况是,如果你有一个非常复杂的正则表达式,Perl的正则表达式实现恰好被优化,但boost的正则表达式引擎不是。

真正的答案是我不知道任何这样的比较,但Perl的正则表达设施不一定是最快的。有关为某些表达式打败Perl正则表达式的算法的一些信息,请参阅here

编辑:通过链接到libperl或使用libPCRE,可以克服启动完整perl解释器的启动成本。如果需要,使用boost可能会为您提供更多灵活性和性能调整选项。

最后注意:在性能方面,boost.regex和Perl的正则表达式之间没有已知的直接比较。解决方案是尝试两者,看看哪个更适合OP的特定情况。

(编辑:现在Boost和PCRE之间有一个很好的比较。见http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/gcc-performance.html

答案 1 :(得分:8)

如果你还没有看到,那就是regexp benchmark in the Great Language Shootout。它根本没有将Perl排名很高。使用boost::xpressive的Boost实现排名第一(在编译时预编译表达式)。但是,这是一个微基准,所以可能无法代表一般正则表达速度,但仍值得一看。

令人惊讶的是,到目前为止,显然最快的正则表达式引擎是Google Chrome的V8 JavaScript JIT(在挂钟时间内几乎胜过GCC,只使用一个CPU核心)

答案 2 :(得分:6)

如果您的正则表达式在编译时是固定的,您也可以考虑Boost.XPressive。它允许人们将正则表达式编写为在编译时解析的表达式模板。

答案 3 :(得分:3)

从最简单的解决方案开始。确定应用程序需要多快的速度。然后测量速度。如果它太慢,尝试更难的解决方案。再次测量。根据需要重复。

虽然我的直觉同意大多数其他答案,说启动翻译会更昂贵,但在你测量之前你永远不会知道。

“尽可能快”,“足够快,适合您的应用”。如果您已经拥有后者,请不要增加前者的复杂性。

答案 4 :(得分:2)

除非你的正则表达式非常复杂(顺便说一句perl的正则表达式引擎非常快),正如其他人所说的那样,你的开销是在解释器启动时。另一方面,你可以运行一个持久的perl,它可以很容易地提供一个正则表达式服务器。

答案 5 :(得分:1)

如果你真的需要快速,你可以获得一个REGEX内容协处理器。我知道有两个。 Titanic制作了一系列处理器。另一个是Cavium。最后,LSI收购了一家规模较小的公司,并开出了一系列regular expression matching processors

这些系统可以并行执行数千个正则表达式,而不是一次一个地执行。使用它们最昂贵的部分是将内存移动到它们并移回它们,并处理块限制等。

但如果表现是一个问题,你可能想尝试这些。

答案 6 :(得分:0)

perl解释器将是固定成本。如果通过解释器运行数据所节省的时间大大超过了解释器成本(即,您有大量数据),那么您将获得性能提升。

由于进程调用,你可能在这里使用纯C ++是最好的。

抱歉,我没有数据。喜欢看你的测试结果。