Kompilasi dan penggunaan kembali dalam ekspresi reguler
Anda dapat mengoptimalkan performa aplikasi yang memanfaatkan ekspresi reguler secara ekstensif dengan memahami bagaimana mesin ekspresi reguler mengkompilasi ekspresi dan bagaimana ekspresi reguler di-cache. Artikel ini membahas kompilasi, pembuatan sumber, dan penembolokan ekspresi reguler yang dikompilasi.
Ekspresi reguler yang ditafsirkan
Secara default, mesin ekspresi reguler mengkompilasi ekspresi reguler ke urutan instruksi internal (ini adalah kode tingkat tinggi yang berbeda dari bahasa perantara umum, atau CIL). Ketika mesin mengeksekusi ekspresi reguler, ia menafsirkan kode internal.
Regex yang dikompilasi
Regex Jika objek dibangun dengan RegexOptions.Compiled opsi , objek akan mengkompilasi ekspresi reguler ke kode CIL eksplisit alih-alih instruksi internal ekspresi reguler tingkat tinggi. Hal ini memungkinkan . Kompiler net just-in-time (JIT) untuk mengubah ekspresi ke kode mesin asli untuk kinerja yang lebih tinggi. Biaya membangun Regex objek mungkin lebih tinggi, tetapi biaya melakukan kecocokan dengannya kemungkinan jauh lebih kecil.
Ekspresi reguler yang dihasilkan sumber
Pembuatan sumber untuk ekspresi reguler tersedia di .NET 7 dan versi yang lebih baru. Generator sumber memancarkan, sebagai kode C#, implementasi khusus Regex
-turunan dengan logika yang mirip dengan apa yang RegexOptions.Compiled
dipancarkan dalam IL. Anda mendapatkan semua manfaat RegexOptions.Compiled
performa throughput dan manfaat start-up dari Regex.CompileToAssembly
, tetapi tanpa kompleksitas CompileToAssembly
. Sumber yang dipancarkan adalah bagian dari proyek Anda, yang berarti juga mudah dilihat dan dapat di-debug.
Jika memungkinkan, gunakan ekspresi reguler yang dihasilkan sumber alih-alih mengkompilasi ekspresi reguler menggunakan RegexOptions.Compiled opsi . Untuk informasi selengkapnya tentang ekspresi reguler yang dihasilkan sumber, lihat generator sumber ekspresi reguler .NET.
Cache ekspresi reguler
Untuk meningkatkan kinerja, mesin ekspresi reguler mempertahankan cache aplikasi dari ekspresi reguler yang dikompilasi. Cache menyimpan pola ekspresi reguler yang hanya digunakan dalam panggilan metode statis. (Pola ekspresi reguler yang disediakan ke metode instans tidak di-cache.) Penembolokan menghindari kebutuhan untuk memilah ulang ekspresi ke dalam kode byte tingkat tinggi setiap kali digunakan.
Jumlah maksimum ekspresi reguler yang di-cache ditentukan oleh nilai properti static
(Shared
dalam Visual Basic)Regex.CacheSize. Secara default, cache mesin ekspresi reguler hingga 15 ekspresi reguler yang dikompilasi. Jika jumlah ekspresi reguler yang dikompilasi melebihi ukuran cache, ekspresi reguler yang paling jarang digunakan dibuang dan ekspresi reguler baru di-cache.
Aplikasi Anda dapat menggunakan kembali ekspresi reguler dengan salah satu dari dua cara berikut:
- Dengan menggunakan metode Regex statis objek untuk menentukan ekspresi reguler. Jika Anda menggunakan pola ekspresi reguler yang telah ditentukan oleh panggilan metode statis lainnya, mesin ekspresi reguler akan mencoba mengambilnya dari cache. Jika tidak tersedia di cache, mesin akan mengkompilasi ekspresi reguler dan menambahkannya ke cache.
- Dengan menggunakan kembali objek yang ada Regex selama pola ekspresi regulernya diperlukan.
Karena overhead instansiasi objek dan kompilasi ekspresi reguler, membuat dan dengan cepat menghancurkan banyak Regex objek adalah proses yang mahal. Untuk aplikasi yang menggunakan sejumlah besar ekspresi reguler yang berbeda, Anda dapat mengoptimalkan performa dengan menggunakan panggilan ke metode statis Regex
dan mungkin dengan meningkatkan ukuran cache ekspresi reguler.