繁体   English   中英

为什么连续初始化std :: regex对象会使程序变慢?

[英]Why does a continuous initialization of a std::regex object slow down the program?

我有以下代码片段,可从std::cin读取行并将其打印到std::cout

#include <iostream>
#include <string>
#include <regex>
int main() {

  //std::regex e2("([^[:blank:]]+)|(\"[^\"]+\")|(\\([^\\)]+\\))");
  const size_t BUFSIZE = (1<<10);
  std::string buffer;
  buffer.reserve( BUFSIZE );

  while (std::getline( std::cin, buffer )) {
    std::cout << buffer << std::endl;
    //std::regex e1("([^[:blank:]]+)|(\"[^\"]+\")|(\\([^\\)]+\\))");
  }
  return 0;
}

输入9,800行的执行时间非常快:

real    0m0.116s
user    0m0.056s
sys     0m0.024s

但是,如果我在while循环中取消注释std::regex e1对象,则执行时间会大大降低:

real    0m2.859s
user    0m2.800s
sys     0m0.032s

另一方面,在循环外部取消注释std::regex e2对象,完全不会影响执行时间。 考虑到我没有应用任何正则表达式匹配项,而是仅构造一个对象,为什么会发生这种情况?

NB:我看过这个话题,但是没有发现任何线索。

为了快速匹配,必须将模式处理为允许快速匹配的形式,这需要很多时间。 这通常是在构造正则表达式对象时完成的。 实际上,这就是构造正则表达式对象的全部要点! 如果在构造过程中没有进行任何额外的工作,那么根本没有单独的regex对象是完全没有意义的-match函数只会将模式作为原始字符串使用,然后使用它。

正则表达式匹配主要实现为有限状态机 实现需要构建此状态机。 状态机取决于您提供的正则表达式。 一些正则表达式通常具有非常复杂的有限状态机。 复杂度将成为正则表达式中可能分支的数量的因素。 状态机越复杂,设置regex对象就需要更多的工作才能开始匹配输入字符串。

正如@Mehrdad正确指出的,之所以存在regex接口而不是其辅助功能的唯一原因是将繁琐的设置状态机的操作隔离开来,然后每个搜索操作的重量就相对较小。

是std :: regex的建议,详细讨论了这些设计NIT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM