【问题标题】:Optimization techniques used by std::regex_constants::optimizestd::regex_constants::optimize 使用的优化技术
【发布时间】:2012-07-20 12:23:19
【问题描述】:

我正在使用std::regex,在阅读std::regex_constants 中定义的各种常量时,我​​遇到了std::optimize,读到它,听起来它在我的应用程序中很有用(我只需要一个实例正则表达式,在开始时初始化,但在整个加载过程中多次使用)。

根据working paper n3126(第1077页),std::regex_constants::optimize

指定正则表达式引擎应该更关注正则表达式匹配的速度,而不是构造正则表达式对象的速度。否则对程序输出没有可察觉的影响。

我很好奇将执行哪种类型的优化,但似乎没有太多关于它的文献(实际上,它似乎未定义),我发现的唯一内容之一是@987654322 @,表示std::regex_constants::optimize

指示正则表达式引擎加快匹配速度,但可能会降低构建速度。例如,这可能意味着将非确定性 FSA 转换为确定性 FSA。

但是,我没有正式的计算机科学背景,虽然我了解 FSA 的基础知识,并了解确定性 FSA 之间的基本区别(每个状态只有一个可能的下一个状态),并且一个非确定性的 FSA(具有多个潜在的下一个状态);我不明白这如何提高匹配时间。另外,我很想知道在各种 C++ 标准库实现中是否还有其他优化。

【问题讨论】:

  • 为了比较,关于 Perls /o 正则表达式优化,有一个 discussion here on SO。对于 Perl 来说,这些优化实际上已经不再有用了。 in the Friedl book 详细讨论了更好的优化技术(关于正则表达式本身的结构)。

标签: c++ regex optimization c++11


【解决方案1】:

在 Jeffrey Friedl 的 Mastering Regular Expressions 中有一些关于正则表达式引擎和性能权衡主题的有用信息(远远超过 stackoverflow 的答案)。

值得注意的是,作为 N3126 的来源的 Boost.Regex 将 optimize 记录为“目前对 Boost.Regex 没有影响。”

附言

确实,它似乎是实现定义的

不,未指定。实现定义意味着需要实现来定义行为选择。实现不需要记录他们的正则表达式引擎是如何实现的或者optimize标志有什么(如果有的话)差异。

附: 2

在各种 STL 实现中

std::regex 不是 STL 的一部分,C++ 标准库与 STL 不同。

【讨论】:

    【解决方案2】:

    请参阅http://swtch.com/~rsc/regexp/regexp1.html,了解基于 NFA 的正则表达式实现如何避免在某些情况下在 DFA 匹配器中发生的指数回溯。

    【讨论】:

    • 那篇文章建议使用 NFA 比使用递归回溯实现的 DFA 正则表达式机器更快。然而,cppreference.com 描述的“优化”表明从 NFA 转换为 DFA 会产生性能优势?这是如何运作的?感谢您的链接,顺便说一句,这是一本有趣的书!
    • @Shaktal - 哦,对了。我想知道他们是否只是不小心切换了 cppreference 文章中的术语。或者他们可能暗示正则表达式编译器可以进行一些分析,并根据具体情况确定 DFA 或 NFA 是否更快。
    • @Shaktal 这篇文章是关于传统自动机如何比执行反向引用和 co 所需的实现快得多。本文的其余部分基本上是对如何实现这样一个有限自动机的简单解释。这是通常的权衡:功率与速度。 Perl“正则表达式”比传统的更强大,但是你放弃了保证的 O(N) 运行时间和简单的优化。 optimize 的一种可能性是检查昂贵实现的附加功能是否必要,如果不需要,则退回到更快的 NFA。
    • 当捕获受限时,不需要回溯,DFA 会更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2023-03-08
    • 1970-01-01
    • 2013-09-13
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多