検索している用語が固定値である文字列に対して単純な包含または置換操作を実行する必要があるたびに、サンプル入力を取得してプロファイリングを実行すると、コンパイルされた正規表現を使用すると、 Stringクラスの同等のメソッドを使用するよりもほぼ*常に高速です。
さまざまな方法を比較してみました(hs
検索する「干し草の山」、検索ndl
する「針」repl
、置換値です。regex
常にオプションを使用して作成されRegexOptions.Compiled
ます):
hs.Replace( ndl, repl )
vsregex.Replace( hs, repl )
hs.Contains( ndl )
vsregex.IsMatch( hs )
2つのテクニックのどちらが速いか(1、2、3、および他の多くのテクニック)に焦点を当てたかなりの数の議論を見つけましたが、それらの議論は常に以下に焦点を当てているようです:
- 単純な操作には文字列バージョンを使用し、複雑な操作には正規表現を使用します(これは、生のパフォーマンスの観点からは、必ずしも良い考えではないようです)。
- テストを実行して2つを比較します(同等のテストの場合、正規表現バージョンの方が常にパフォーマンスが優れているようです)。
これがどのように当てはまるのかわかりません。正規表現エンジンは、同等の文字列バージョンよりも速く、サブ文字列の一致について2つの文字列をどのように比較しますか?これは、非常に小さいまたは非常に大きい検索スペース、小さいまたは大きい検索用語、または検索用語が検索スペースの早い段階または遅い段階にあるかどうかに当てはまるようです。
では、なぜ正規表現が高速なのですか?
*実際、文字列バージョンがコンパイルされた正規表現よりも高速であることを示すことができた唯一のケースは、空の文字列を検索する場合です。それ以外の場合、単一文字列から非常に長い文字列まで、同等の文字列メソッドよりもコンパイルされた正規表現によって高速に処理されます。
更新:コンパイル時に検索語がわかっている場合を調べていることを明確にする句を追加しました。動的または1回限りの操作の場合、正規表現をコンパイルするオーバーヘッドは、文字列メソッドを優先して結果を歪める傾向があります。