0

以下に示すような正規表現の比較を行うコードがあり、コードを最適化することを考えました。.net プロファイラーで確認すると、ここで 80% の時間が費やされていることが示され、正規表現フィルターでバックトラッキングが発生するかどうかを確認しましたが、その正規表現側に問題はありませんでした。これは既存のコードです

public class TestFilter : SmoothFilter
   {
     public override bool Apply(Team liveEvent)
          {
                   // Apply each individual piece of the filter using the Match method
                   if ((Filter == null) || (Filter.Length <= 0) || Match(Filter, pl.Instance))
                   {

          }

    private bool Match(string pattern, string inputdata)
    {
        bool vals = Regex.IsMatch(inputdata, pattern, RegexOptions.IgnoreCase);
        return vals;
    }
}

私がグーグルで検索したとき、リンクhttp://blog.kurtschindler.net/post/regular-expression-performance-comparisonsを見たところ、初期起動時間がかからない場合の最良かつより高速な方法について言及されています。そのため、以下に示すようにコードを変更しました。しかし、私は自分のシステムを動かしたので、プロファイリングするツールがありません 本当に改善されたかどうか教えてもらえますか? 以下のこの変更されたコード

 static readonly Regex regexForMethod_E = new Regex("pattern", RegexOptions.Compiled);

 private bool Match(string pattern, string inputdata)
 {
     bool vals = regexForMethod_E.IsMatch("inputdata");
     return vals;
}

編集

Match() メソッド内で正規表現のインスタンス化を移動する方法がまだわかりません

4

2 に答える 2

1

パターンの複雑さによって異なります。いずれにしても遅くなることはありません。正規表現の複雑さが増すにつれて、より高速になります。

また、コードは同等ではありません。そのためには、次のように呼び出す必要があります。

new Regex("pattern", RegexOptions.Compiled | RegexOptions.IgnoreCase);
于 2012-07-18T09:00:55.943 に答える
0

短い答え: はい、そう思いますが、どの程度かはわかりません。

長い(より長い)回答:あなたは自分自身と計算に多くの時間を節約していると思います。最初のインスタンスでメソッドが実行する必要があるオンザフライ計算を見てください。次に、2 番目のメソッドでどの程度の処理を行う必要があるかを見てみましょう。関数には、3 つではなく 1 つのパラメーターを渡すだけで済みます。これはパフォーマンスの向上です (わずかではありますが)。

正規表現は既に計算されているため、プログラムが行う必要があるのは、すべてのパラメーターを取得してオンザフライで計算するのではなく、入力データに対してチェックすることだけです。

さらに高速な方法は次のとおりです。

private bool Match(string inputdata)
{
     return regexForMethod_E.IsMatch("inputdata");
}

変更がほとんど無視できることはわかっていますが、この呼び出しが 1000 回行われたと想像してください。これは、実際には必要のない 1000 個のブール変数です。

于 2012-07-18T07:30:11.223 に答える