Когда я должен предпочесть boost :: regex (или boost :: xpressive) перед boost :: алгоритмом - PullRequest
1 голос
/ 24 мая 2011

Я думал, что двигатели boost regex будут быстрее, чем boost :: алгоритма
Этот простой тест показывает, что алгоритм Regex побеждает с большим отрывом
Это вся тестовая программа
Я что-то пропустил?

#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 ]

3 голосов
/ 25 мая 2011

Я не нахожу это таким уж удивительным;простые вещи обычно быстрее.В языках более высокого уровня, скажем JavaScript, обычно выгодно делегировать обработку строк регулярному выражению, потому что есть много накладных расходов даже на выполнение простого цикла в интерпретируемом языке, но те же соображения не применимы к компилируемым языкам, таким как C ++.

В любом случае, я бы сказал, что вы должны использовать алгоритмы строки надстройки над регулярным выражением, если это целесообразно, поскольку boost :: regex вводит зависимость времени выполнения (она использует внешний файл .so), тогда как алгоритмы в основномвстроенные генераторы кода, и вы должны использовать регулярные выражения только там, где они вам нужны ... скажем, ищите число с плавающей запятой:

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

вы хотите попробовать это без регулярных выражений?

3 голосов
/ 24 мая 2011

regex может обрабатывать все виды регулярных выражений (например, что-то вроде «My. * Test» можно сопоставить в тексте, например «Интересно, сколько классов с именем MySumTest было написано?»)Они более мощные, но менее производительные, чем алгоритмы поиска шаблона в тексте

...