[英]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函数只会将模式作为原始字符串使用,然后使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.