Delen via


Compilatie en hergebruik in reguliere expressies

U kunt de prestaties van toepassingen optimaliseren die uitgebreid gebruikmaken van reguliere expressies door te begrijpen hoe de engine voor reguliere expressies expressies compileert en hoe reguliere expressies in de cache worden opgeslagen. In dit artikel worden compilatie, brongeneratie en caching van gecompileerde reguliere expressies besproken.

Geïnterpreteerde reguliere expressies

De engine voor reguliere expressies compileert standaard een reguliere expressie naar een reeks interne instructies (dit zijn codes op hoog niveau die afwijken van een gemeenschappelijke tussentaal of CIL). Wanneer de engine een reguliere expressie uitvoert, worden de interne codes geïnterpreteerd.

Gecompileerde reguliere expressies

Als een Regex object is samengesteld met de RegexOptions.Compiled optie, wordt de reguliere expressie gecompileerd naar expliciete CIL-code in plaats van interne instructies voor reguliere expressies op hoog niveau. Dit staat toe. De JIT-compiler (Just-In-Time) van NET om de expressie te converteren naar systeemeigen computercode voor betere prestaties. De kosten voor het maken van het Regex object kunnen hoger zijn, maar de kosten voor het uitvoeren van overeenkomsten met het object zijn waarschijnlijk veel kleiner.

Door bron gegenereerde reguliere expressies

Brongeneratie voor reguliere expressies is beschikbaar in .NET 7 en latere versies. De brongenerator verzendt, als C#-code, een aangepaste Regex- afgeleide implementatie met logica die vergelijkbaar is met wat RegexOptions.Compiled in IL wordt verzonden. U krijgt alle voordelen van doorvoerprestaties en RegexOptions.Compiled de opstartvoordelen van Regex.CompileToAssembly, maar zonder de complexiteit van CompileToAssembly. De bron die wordt verzonden, maakt deel uit van uw project, wat betekent dat het ook eenvoudig kan worden weergegeven en foutopsporing kan worden uitgevoerd.

Gebruik waar mogelijk reguliere expressies die door de bron zijn gegenereerd in plaats van reguliere expressies te compileren met behulp van de RegexOptions.Compiled optie. Zie .NET-bronbrongeneratoren voor meer informatie over brongegenereerde reguliere expressies.

De cache voor reguliere expressies

Om de prestaties te verbeteren, onderhoudt de engine voor reguliere expressies een toepassingsbrede cache van gecompileerde reguliere expressies. In de cache worden reguliere expressiepatronen opgeslagen die alleen worden gebruikt in statische methode-aanroepen. (Reguliere expressiepatronen die worden geleverd aan exemplaarmethoden worden niet in de cache opgeslagen.) Caching voorkomt dat een expressie telkens wanneer deze wordt gebruikt, opnieuw moet worden geparseerd in bytecode op hoog niveau.

Het maximum aantal reguliere expressies in de cache wordt bepaald door de waarde van de static eigenschap (Sharedin Visual Basic). Regex.CacheSize Standaard worden met de engine voor reguliere expressies maximaal 15 gecompileerde reguliere expressies in de cache opgeslagen. Als het aantal gecompileerde reguliere expressies groter is dan de cachegrootte, wordt de laatst gebruikte reguliere expressie verwijderd en wordt de nieuwe reguliere expressie in de cache opgeslagen.

Uw toepassing kan reguliere expressies op een van de volgende twee manieren opnieuw gebruiken:

  • Met behulp van een statische methode van het Regex object om de reguliere expressie te definiëren. Als u een normaal expressiepatroon gebruikt dat al is gedefinieerd door een andere aanroep van een statische methode, probeert de engine voor reguliere expressies het op te halen uit de cache. Als deze niet beschikbaar is in de cache, compileert de engine de reguliere expressie en voegt deze toe aan de cache.
  • Door een bestaand Regex object opnieuw te gebruiken zolang het reguliere expressiepatroon nodig is.

Vanwege de overhead van object instantiëring en reguliere expressiecompilatie is het maken en snel vernietigen van talloze Regex objecten een duur proces. Voor toepassingen die een groot aantal verschillende reguliere expressies gebruiken, kunt u de prestaties optimaliseren met behulp van aanroepen naar statische Regex methoden en mogelijk door de grootte van de reguliere expressiecache te vergroten.

Zie ook