2

複数の Regex コマンド (全部で約 20) を使用してメッセージを解析すると、パフォーマンスの問題が発生します。

効率を高めるために、私は次のことを行っています。

1)正規表現コマンドを可能性順に並べました。

2) 一致が見つかったら、一致するループから抜け出すようにしました。

私ができる他の改善点があるかどうか、または私の問題に対するより良いアプローチがあるかどうか疑問に思っています.

コーリング コード:

        bool resolved = false;
        Match regexMatch = null;

        foreach (var resolverKvp in _resolvers)
        {
            if (resolverKvp.Key.Pattern.IsMatch(topicName))
            {
                regexMatch = resolverKvp.Key.Pattern.Match(topicName);
                //  Use the kvp value
                resolved = true;
                break;
            }
        }

繰り返し実行される正規表現コマンドのサンプル:

    <add messagename="BackLayVolumeCurrencyOddsFormat" pattern="^.*/M/E_([0-9]+)/MEI/MDP/(\d{1,3})_(\d{1,3})_(\d+)_([a-zA-Z]{3})_([1-3])$" assembly="Client.Messaging"
      type="Client.Messaging.TopicMessages.BackLayVolumeCurrencyOddsFormatResolver">
    </add>

    <add messagename="Market1" pattern="^.*/M/E_([0-9]+)$" assembly="Client.Messaging"
      type="Client.Messaging.TopicMessages.Market1Resolver">
    </add>

データ例:

regex 1:
6/E/E_1/E/E_511010/E/E_527901/E/E_631809/E/E_631810/E/E_631811/M/E_1379656/MEI/MDP/10_10_1_USD_3

regex 2:
1/E/E_1/E/E_100004/E/E_190539/E/E_632113/E/E_632120/M/E_1380084

前もって感謝します。

4

2 に答える 2

3

最初の (小さい) 注目すべき点は、見つかった正規表現が 2 回実行されることです。1 回は一致をチェックし、次に一致を見つけます。ismatch が与えるパフォーマンスの違いはわかりませんが、次のようにチェックと検索を組み合わせることができます。

regexMatch = resolverKvp.Key.Pattern.Match(topicName);
if (regexMatch.Success)
{
      //etc
于 2012-06-12T10:14:07.230 に答える
1

試みるべきことの 1 つは、式で避けること.*です。あなたの例では、特に式が一致しない場合は不要であり、無料ではありません。非常に簡単で汚れたテストでは、パターン 1 と^.*部品なしの同等のパターンの間に 2 倍の係数が示されました。

さらに、.*式で複数回使用すると、壊滅的なバックトラッキングが発生する可能性があります。

于 2012-06-12T10:20:37.287 に答える