2016-08-30 12 views
-1

どのように、この正規表現の性能を向上させることができる。正規表現の性能向上

^([A-Za-z0-9+/=])*$ 

これはA-Z、Z、0-9、+/0以上を有する文字列を一致させるために使用されます。 =

編集:私はNUnitのループでそれをテストしてい

internal static class Base64Determinator 
    { 
     private static Regex base64Regex; 

     static Base64Determinator() 
     { 
      var base64Pattern = "^(?>[A-Za-z0-9+/=]?)*$"; 
      base64Regex = new Regex(base64Pattern, RegexOptions.Compiled); 
     } 

     internal static bool IsBase64(string input) 
     { 
      return input != null && base64Regex.IsMatch(input); 
     } 
    } 

[Test] 
     public void TestInputs() 
     { 
      var inputs = new List<Tuple<string, bool>> 
      { 
       new Tuple<string, bool>(null, false), 
       new Tuple<string, bool>("asd", true), 
       new Tuple<string, bool>("qwertyuiop", true), 
       new Tuple<string, bool>("QWERTYUIOP", true), 
       new Tuple<string, bool>(
        "QWERTYUIOPrfweiowcq489ynOILSDKFJSLDJfLKsdjflksdjflskdjfLSKDJflkLSKJFWIOEFJOIJSFLDKJflSDJFLKSJfsl", 
        true), 
       new Tuple<string, bool>("=+/Z0", true), 
       new Tuple<string, bool>("=+/Z", true), 
       new Tuple<string, bool>("[email protected]#$%^&*()P", false), 
       new Tuple<string, bool>("!", false), 
       new Tuple<string, bool>("<", false), 
       new Tuple<string, bool>(">", false), 
       new Tuple<string, bool>(".", false), 
       new Tuple<string, bool>("qwertyuiopoiuytrewqwertyuioplkjhgfdsadfghjklmnbvcxzxcvbnm<script>", false), 
       new Tuple<string, bool>("qwertyuiopoiuytrewqwertyuioplkjhgfdsadfghjklmnbvcxzxcvbnm", true), 
      }; 

      var startNew = Stopwatch.StartNew(); 
      for (int j = 0; j < 10000000; j++) 
      { 
       //inputs.ForEach(i => Assert.AreEqual(i.Item2, Base64Determinator.IsBase64(i.Item1))); 
       inputs.ForEach(i => Base64Determinator.IsBase64(i.Item1)); 
      } 

      startNew.Stop(); 

      Console.WriteLine(startNew.Elapsed); 
     } 

これは約2.36分を要し これがコードです。私は2秒かかる他の実装を見てきました。だから私はそこに最小バックトラックでこの正規表現を形成する良い方法があるのだろうかと思っています。

おかげで、 のRashmi

+1

現時点での性能に問題は何ですか? – Enigmativity

+5

パフォーマンスは、入力を含む多くのことに依存します。パフォーマンスの問題を再現する良い[mcve]を提供してください。具体的には、測定されたパフォーマンスは何ですか、あなたの期待されるパフォーマンスは何ですか? .NETの 'Regex'クラスのパフォーマンスを向上させるためにできる最も重要なことの1つは、' Regex'オブジェクトが一度だけ作成され、必要なときに再利用され、 'Compiled'オプションです。 –

+1

アトミックグループを使うと助けになるかもしれませんが、ネストされた '? '量子をなぜ追加しましたか?単に '*'を使って '' ^(?> [A-Za-z0-9 +/=] *)$ "'というグループの中に入れてください。しかし、私はあなたが 'IsMatch()'を呼び出す方法が最大の問題だと思っています。コンストラクタではなく、変数を宣言するときに正規表現をコンパイルしてみてください。 –

答えて

0

パフォーマンスは、入力の複雑さに依存します。 Regex.MatchTimeoutプロパティを使用することができます。 要件に応じて時間幅(たとえば200 ms)を定義することができ、適切なメッセージを表示することができます。

Regex.Matchメソッド(String、文字列、RegexOptions、TimeSpanの)