1

ブースト正規表現エンジンは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;
}
4

2 に答える 2

3

これはそれほど驚くべきことではありません。通常、単純なものの方が高速です。JavaScript などの高水準言語では、インタープリター言語で単純なループを実行するだけでもオーバーヘッドが非常に大きいため、文字列処理を正規表現に委譲することは通常有利ですが、同じ理由は C++ のようなコンパイル済み言語には当てはまりません。

とにかく、アルゴリズムが基本的にインラインコードジェネレーターであるのに対し、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 に答える