首先,请注意我使用了BOOST_REGEX_MATCH_EXTRA这个宏来捕获多个子表达式,具体功能请参考:http://www.cppprog.com/boost_doc/libs/regex/doc/html/boost_regex/captures.html。
其中描述到: 激活这个特性会造成性能影响(即使你不使用),如果你使用就会有更大的影响。
事实也确实如此,我写了一个程序来提取cpp文件中所有的函数原型,如:
A.cpp文件中有:
void A::Func1()
{
....
}
void A::Func2(int i)
{
....
}
void A::Func2(int i, A& a)
{
....
}
将此文件输入程序后所得到的结果是:
void A::Func1()
void A::Func2(int i)
void A::Func2(int i, A& a)
我的代码如下(仅列出主要部分):
string::const_iterator start, end;
start = m_content.begin();
end = m_content.end();
while(regex_search(start, end, what, r, flags))
{
...
start = what[0].second;
// 下面两行是提升性能的关键
smatch tmp;
what = tmp;
}
}
我测试的是1300多行的cpp文件,当加上“smatch tmp; what = tmp;”后,性能提升了“无穷倍”,因为没有这两行,我不知道要等到什么时候,而加了后就执行了2s多。原因我估计是内部状态机的问题,但尚需深入研究后确定。