Kompilering och återanvändning i reguljära uttryck
Du kan optimera prestandan för program som använder reguljära uttryck i stor utsträckning genom att förstå hur reguljära uttrycksmotorn kompilerar uttryck och hur reguljära uttryck cachelagras. I den här artikeln beskrivs kompilering, källgenerering och cachelagring av kompilerade reguljära uttryck.
Tolkade reguljära uttryck
Som standard kompilerar motorn för reguljära uttryck ett reguljärt uttryck till en sekvens med interna instruktioner (det här är högnivåkoder som skiljer sig från vanligt mellanliggande språk eller CIL). När motorn kör ett reguljärt uttryck tolkas de interna koderna.
Kompilerade reguljära uttryck
Om ett Regex objekt skapas med RegexOptions.Compiled alternativet kompilerar det reguljära uttrycket till explicit CIL-kod i stället för interna instruktioner för reguljära uttryck på hög nivå. Detta tillåter . NET:s jit-kompilator (just-in-time) för att konvertera uttrycket till inbyggd datorkod för högre prestanda. Kostnaden för att Regex konstruera objektet kan vara högre, men kostnaden för att utföra matchningar med det är sannolikt mycket mindre.
Källgenererade reguljära uttryck
Källgenerering för reguljära uttryck är tillgängligt i .NET 7 och senare versioner. Källgeneratorn genererar, som C#-kod, en anpassad Regex
-härledd implementering med logik som liknar vad som RegexOptions.Compiled
genereras i IL. Du får alla prestandafördelar med RegexOptions.Compiled
dataflöde och startfördelarna med Regex.CompileToAssembly
, men utan komplexiteten i CompileToAssembly
. Källan som genereras är en del av projektet, vilket innebär att den också är lätt att se och koppla bort.
Använd där det är möjligt källgenererade reguljära uttryck i stället för att kompilera reguljära uttryck med hjälp av RegexOptions.Compiled alternativet . Mer information om källgenererade reguljära uttryck finns i källgeneratorer för reguljära .NET-uttryck.
Cacheminnet för reguljära uttryck
För att förbättra prestandan upprätthåller motorn för reguljära uttryck en programomfattande cache med kompilerade reguljära uttryck. Cachen lagrar mönster för reguljära uttryck som endast används i statiska metodanrop. (Reguljära uttrycksmönster som tillhandahålls till instansmetoder cachelagras inte.) Cachelagring undviker behovet av att skriva om ett uttryck i bytekod på hög nivå varje gång det används.
Det maximala antalet cachelagrade reguljära uttryck bestäms av värdet för static
egenskapen (Shared
i Visual Basic). Regex.CacheSize Som standard cachelagrar motorn för reguljära uttryck upp till 15 kompilerade reguljära uttryck. Om antalet kompilerade reguljära uttryck överskrider cachestorleken ignoreras det senast använda reguljära uttrycket och det nya reguljära uttrycket cachelagras.
Ditt program kan återanvända reguljära uttryck på något av följande två sätt:
- Genom att använda en statisk metod för Regex objektet för att definiera det reguljära uttrycket. Om du använder ett mönster för reguljära uttryck som redan har definierats av ett annat statiskt metodanrop försöker motorn för reguljära uttryck hämta det från cacheminnet. Om den inte är tillgänglig i cacheminnet kompilerar motorn det reguljära uttrycket och lägger till det i cacheminnet.
- Genom att återanvända ett befintligt Regex objekt så länge det reguljära uttrycksmönstret behövs.
På grund av omkostnaderna för instansiering av objekt och kompilering av reguljära uttryck är det en dyr process att skapa och snabbt förstöra många Regex objekt. För program som använder ett stort antal olika reguljära uttryck kan du optimera prestanda med hjälp av anrop till statiska Regex
metoder och eventuellt genom att öka storleken på cacheminnet för reguljära uttryck.