0

私のアプリケーションは非常に遅く、正常になるまでに数時間かかることがあります。プロファイラーを使用したとき、正規表現の一致が発生する場所に過ぎない長い時間がかかるコードを見つけました。体がパフォーマンスを改善する方法を教えてくれますか. コード スニペットを以下に示します。

Regex rx = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
rx.IsMatch("john.gilbert.stu.seattle.washington.us"); 

パターンをキャッシュして再利用する方法はありますか?

4

2 に答える 2

3

コンパイルしてキャッシュすることで RegEx をいくらか高速化できますが、現在の規模でパフォーマンスの問題を解決できる可能性はほとんどありません。つまり、O(n^2) を必要とする一部の低速の RegEx は、キャッシング/コンパイルまたはその他の種類の自動処理により、魔法のように O(n) にはなりません。

正規表現を確認し、それぞれが実行される回数を検証する必要があります。最速のコードは、まったく実行する必要がないコードです。そのため、最初に無駄な一致がある場合は削除してください。テキストを解析するより適切な方法に切り替える必要がある場合があります (つまり、HTML の RegEx 解析はおそらく間違った方法です。HtmlAgilityPack のような優れた HTML パーサーとターゲット クエリを組み合わせた方が適切な場合があります)。

于 2012-05-31T17:16:47.093 に答える
1

文字列の解析がそれほど複雑でない場合は、それらを文字配列に変換して自分で解析します。これにより、パフォーマンスが大幅に向上します。RegEx のパフォーマンスは非常に低いです。

for (int i = 0; i < string.Length; i++)
{
     if (string[i] has some defining quality)
         if (string[i] meets second requirement)
         // break, change flag, ect.
}
于 2012-05-31T17:25:29.470 に答える