コンパイルと再利用
既定では、正規表現エンジンは正規表現をコンパイルして内部命令のシーケンスを生成します。これらは Microsoft Intermediate Language (MSIL) とは別の高水準コードです。エンジンは正規表現を実行するときに、その内部コードを解釈します。
Regex オブジェクトを構築するときに RegexOptions.Compiled オプションを使用した場合、正規表現エンジンは正規表現をコンパイルして、高水準の正規表現内部命令ではなく、明示的な MSIL コードを生成します。これにより、.NET Framework の JIT (Just-In-Time) コンパイラは、正規表現をネイティブな機械語コードに変換してパフォーマンスの向上を図ることができます。
ただし、生成された MSIL はアンロードできません。コードをアンロードする唯一の方法は、アプリケーション ドメイン全体をアンロードする (つまり、アプリケーションのコードをすべてアンロードする) ことです。実際には、正規表現を RegexOptions.Compiled オプションを使用してコンパイルすると、たとえ Regex オブジェクト自体がガベージ コレクションのために解放された場合でも、NET Framework は、コンパイルされた正規表現が使用するリソースを決して解放しません。
このため、RegexOptions.Compiled オプションを使用してコンパイルする正規表現の数を制限することで、リソースの消費が過度にならないように注意する必要があります。大量または無制限の正規表現をアプリケーションで使用する必要がある場合、Options.Compiled オプションを使用したコンパイルを行わないようにします。ただし、少数の正規表現を繰り返して使用する場合は、パフォーマンスを向上させるために RegexOptions.Compiled を使用して正規表現をコンパイルする必要があります。別の方法として、プリコンパイル済みの正規表現を使用することもできます。すべての表現を、再利用できる DLL にコンパイルできます。これにより、実行時にコンパイルする必要がなくなり、コンパイルされた正規表現の処理速度も維持されます。
パフォーマンスを向上させるために、正規表現エンジンはすべての正規表現をメモリ上にキャッシュします。これにより、正規表現を使用するたびに解析し直して高水準のバイト コードを生成する必要がなくなります。