什么时候我应该比boost :: algorithm更喜欢boost :: regex(或boost :: xpressive)

时间:2011-05-24 18:59:17

标签: c++ boost-regex boost-xpressive

我认为增强正则表达式引擎比boost :: algorithm更快 这个简单的测试显示算法大幅击败正则表达式引擎 这是整个测试程序
我错过了什么吗?

#include "boost/algorithm/string.hpp"
#include "boost/regex.hpp"
#include "boost/xpressive/xpressive.hpp"
#include "boost/progress.hpp"
#include <iostream>

int main()
{
    boost::timer tm;
    const int ITERATIONS = 10000000;
    {
        std::string input("This is his face");
        tm.restart();
        for( int i = 0; i < ITERATIONS; ++i)
        {
            boost::algorithm::replace_all(input,"his","her");
        }
        std::cout << "boost::algorithm: " << tm.elapsed()/60 << std::endl;
    }

    {
        std::string input("This is his face");
        boost::regex expr("his");
        std::string format("her");
        tm.restart();
        for( int i = 0; i < ITERATIONS; ++i)
        {
            boost::regex_replace( input, expr, format );
        }
        std::cout << "boost::regex: " << tm.elapsed()/60 << std::endl;
    }

    {
        std::string input("This is his face");
        boost::xpressive::sregex expr = boost::xpressive::as_xpr("his");
        std::string format("her");
        tm.restart();
        for( int i = 0; i < ITERATIONS; ++i)
        {
            boost::xpressive::regex_replace(input, expr, format);
        }
        std::cout << "boost::xpressive: " << tm.elapsed()/60 << std::endl;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

正则表达式可以处理所有类型的正则表达式(例如“My。* Test”之类的东西可以在“我想知道有多少个名为MySumTest的类已写入?”的文本中匹配。它们比在文本中查找模式的算法更强大但性能更低

答案 1 :(得分:3)

我觉得这并不令人惊讶;简单的事情通常更快。在更高级别的语言中,比如JavaScript,将字符串处理委托给正则表达式通常是一个胜利,因为即使在解释语言中进行简单循环也会产生很多开销,但同样的推理并不适用于像C ++这样的编译语言。

无论如何,我会说你应该在regex上使用boost字符串算法,这是合理的,因为boost :: regex引入了运行时依赖(它使用外部.so文件),而算法基本上是内联代码生成器,你应该只在你需要的地方使用正则表达式...比如找一个浮点数:

[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?

你想在没有正则表达式的情况下尝试吗?