Когда я должен предпочесть boost::regex (или boost::xpressive) перед boost:: алгоритмом
Я думал, что двигатели 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 ответа
regex может обрабатывать все виды регулярных выражений (например, что-то вроде "My.*Test" может быть сопоставлено в тексте типа "Интересно, сколько классов с именем MySumTest было написано?"). Они более мощные, но менее производительные, чем алгоритмы поиска шаблона в тексте.
Я не нахожу в этом ничего удивительного; простые вещи обычно быстрее. В языках более высокого уровня, скажем, JavaScript, обычно выгодно делегировать обработку строк регулярному выражению, потому что есть много накладных расходов даже на выполнение простого цикла в интерпретируемом языке, но те же соображения не применимы к компилируемым языкам, таким как C++.
В любом случае, я бы сказал, что вы должны использовать алгоритмы строки надстройки над регулярным выражением, если это целесообразно, поскольку boost::regex вводит зависимость времени выполнения (она использует внешний файл.so), тогда как алгоритмы в основном являются встроенными генераторами кода, и вы следует использовать регулярные выражения только там, где они вам нужны... скажем, ищите число с плавающей запятой:
[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
Вы хотели бы попробовать это без регулярных выражений?