您的位置:首页 > 其它

如何在使用了BOOST_REGEX_MATCH_EXTRA情况下提高boost::regex_search的执行速度

2010-04-14 16:15 363 查看
首先,请注意我使用了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)



我的代码如下(仅列出主要部分):

void Parser::Run()
{
    regex r("(((//w+::)*)(//w+)[&*//^]?)//s+(//w+::)*(//w+)//(//s*((((//w+::)*(//w+)//s*[&*//^]?)//s*(//w+)//s*,//s*)*((//w+::)*(//w+)//s*[&*//^]?)//s*(//w+))?//s*//)//s*//{");
    smatch what; 
    match_flag_type flags = boost::match_extra ; 
        
    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多。原因我估计是内部状态机的问题,但尚需深入研究后确定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: