1

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

#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;
}
4

2 回答 2

3

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

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

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

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

于 2011-05-24T20:50:59.717 回答
3

regex 可以处理各种正则表达式(例如,“My.*Test”之类的内容可以在“我想知道已经编写了多少个名为 MySumTest 的类?”之类的文本中匹配)。它们比在文本中查找模式的算法更强大但性能更低

于 2011-05-24T19:07:45.727 回答