Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::regex_constants::optimize使用的优化技术_C++_Regex_Optimization_C++11 - Fatal编程技术网

C++ std::regex_constants::optimize使用的优化技术

C++ std::regex_constants::optimize使用的优化技术,c++,regex,optimization,c++11,C++,Regex,Optimization,C++11,我正在使用std::regex,在阅读std::regex_constants中定义的各种常量时,我遇到了std::optimize,读到它,听起来它在我的应用程序中很有用(我只需要一个regex实例,在开始时初始化,但它在整个加载过程中被多次使用) 根据(第1077页),std::regex_constants::optimize: 指定正则表达式引擎应更多地关注正则表达式的匹配速度,而较少关注正则表达式对象的构造速度。否则,它对程序输出没有可检测的影响 我很好奇将执行哪种类型的优化,但似乎没

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

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

指定正则表达式引擎应更多地关注正则表达式的匹配速度,而较少关注正则表达式对象的构造速度。否则,它对程序输出没有可检测的影响

我很好奇将执行哪种类型的优化,但似乎没有太多关于它的文献(事实上,它似乎没有定义),我发现的唯一一件事是at,它指出
std::regex_constants::optimize

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


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

< P>关于Jeffrey Friedl的ReX引擎和性能权衡(远大于适合堆栈溢出答案)的主题,有一些有用的信息。 值得注意的是,N3126的源代码Boost.Regex将
optimize
记录为“这目前对Boost.Regex没有影响”

附言

事实上,它似乎是由实现定义的

不,它是未指定的。实现定义意味着需要一个实现来定义行为的选择。实现不需要记录它们的正则表达式引擎是如何实现的,或者
优化
标志有什么不同(如果有)

第2页

在各种STL实现中


< > >代码> STD::ReXEX <代码>不是STL的一部分,C++标准库与STL不一样。

< P>参见NFA的正则表达式如何避免在特定情况下DFA匹配器中出现的指数回溯的一个很好的解释。对于Perl来说,这些优化实际上已经没有什么作用了。我们详细讨论了更好的优化技术(关于正则表达式本身的结构)。那篇文章建议使用NFA比使用递归回溯实现的DFA正则表达式机器更快。然而“优化”由cppreference.com描述表明,从NFA转换为DFA会产生性能优势?这是如何工作的?感谢链接,顺便说一句,这是一个有趣的阅读!@Shaktal-哦,对了。我想知道他们是否只是无意中切换了cppreference文章中的术语。或者他们可能暗示regex编译器可能会o进行一些分析,并基于此确定DFA或NFA在个案基础上是否更快。@Shaktal这篇文章是关于传统自动机如何比执行反向引用和协同所需的实现快得多。本文的其余部分基本上是对如何实现这样一个有限自动机的简单解释这是通常的折衷:Power vs.Speed.Perl“regex”比传统的更强大,但是您放弃了保证的O(N)运行时和简单优化。
优化的一种可能性是检查昂贵实现的附加功能是否必要,如果不是,则返回到更快的NFA。当捕获受到限制时,则不需要回溯,DFA将更快。