私は大文字と小文字のC#正規表現を解釈すると問題なく動作しますが、少し遅いです。私はRegexOptions.Compiled
を設定することでこれをスピードアップしようとしています、そして、これは最初の時間は約30秒かかると思われます。私は最初にアセンブリに正規表現をコンパイルすることでこれを無効にしようとしているので、私のアプリはできるだけ早くすることができます。なぜ私の正規表現は翻訳よりもずっと遅くコンパイルされていますか?
Regex myComplexRegex = new Regex(regexText, RegexOptions.Compiled);
MatchCollection matches = myComplexRegex.Matches(searchText);
foreach (Match match in matches) // <--- when the one-time long delay kicks in
{
}
または事前にRegex.CompileToAssembly使用:
MatchCollection matches = new CompiledAssembly.ComplexRegex().Matches(searchText);
foreach (Match match in matches) // <--- when the one-time long delay kicks in
{
}
これが作ってアセンブリにコンパイルされたコンパイルの遅延は、それがアプリでコンパイルされていますか、起こったとき
私の問題はあります私はまだ最初のforeach
呼び出しで遅延を得るので、基本的に役に立たない。私が望むのは、(Regex.CompileToAssembly呼び出しで)コンパイル時に実行時にではなく、コンパイル時にすべてのコンパイル遅延を実行することです。どこが間違っていますか?
(アセンブリにコンパイルする際に使用するコードは、http://www.dijksterhuis.org/regular-expressions-advanced/と似ています)。
編集:new CompiledAssembly.ComplexRegex().Matches(searchText);
でコンパイルアセンブリを呼び出すとき
私はnew
を使用する必要がありますか。それはそれがなくても "オブジェクト参照が必要"というエラーを出します。
アップデート2の回答/コメント
感謝。私が使用している正規表現はかなり長いですが、基本的には単純です。数千語のリストが|で区切られています。私はそれが本当にバックトラッキングの問題になるのを見ることができません。件名の文字列は1文字の長さに過ぎず、それでもコンパイルの遅延が発生する可能性があります。 RegexOptions.Compiled regexでは、正規表現に5000語が含まれている場合、実行に10秒以上かかるでしょう。比較のために、正規表現のコンパイルされていないバージョンは30,000以上の単語をとり、まだ瞬時に実行することができます。私は私が見つけた何を考えてこの上の多くのテストを行った後
は、次のとおりです。
-
あなたの正規表現は多くの選択肢を持っているとき
- はRegexOptions.Compiledを使用しないでください - それはへのへの極端に遅くなることがありますコンパイル。可能であれば、lazy evaluation for regexを使用し、AFAIはこれが(少なくともある程度は)正規表現のコンパイルにも拡張されていることがわかります。正規表現は完全にコンパイルされていなければならず、コンパイルを強制する方法がないようです。
- Regex.CompileToAssemblyは、正規表現が完全にコンパイルされなければならない場合には、はるかに役立ちます。
私が間違っているか何かを見つけられない場合は、私に修正してください!
おそらく、実際の式とサンプル入力を共有しようとする必要があります。 – driis
このポストをありがとう。いくつかのRegex by TwitterでJavaから.NETに移植された同じ問題がありました。 RegexOptions.Compiledと.CompileToAssemblyの両方が、アプリケーションが最初に一致しようとすると約10秒間ハングしました。 Regex.Compiledを削除しました。 – LongZheng
MSDNは、[regexのコンパイル済みアセンブリ](http://msdn.microsoft.com/en-us/library/gg578045.aspx#sectionToggle4)に対処した.NET 4のベストプラクティス記事を追加しました。 –