Compilazione e uso ripetitivo nelle espressioni regolari
Se si comprendono le modalità con cui le espressioni regolari vengono compilate dal motore e vengono memorizzate nella cache, è possibile ottimizzare le prestazioni delle applicazioni che fanno ampio uso di espressioni regolari. Questo articolo illustra la compilazione, la generazione dell’origine e la memorizzazione nella cache delle espressioni regolari compilate.
Espressioni regolari interpretate
Per impostazione predefinita, il motore delle espressioni regolari compila un'espressione regolare in una sequenza di istruzioni interne. Si tratta di codici di alto livello che sono diversi dal linguaggio intermedio comune o CIL. Quando il motore esegue un'espressione regolare, interpreta i codici interni.
Espressioni regolari compilate
Se un oggetto Regex viene costruito con l'opzione RegexOptions.Compiled, compila l'espressione regolare in codice CIL esplicito invece che in istruzioni interne di espressione regolare di alto livello. In questo modo il compilatore JIT di.NET può convertire l'espressione in codice macchina nativo per ottimizzare le prestazioni. Il costo di costruzione dell'oggetto Regex può essere più elevato, ma è probabile che il costo di esecuzione delle corrispondenze con tale oggetto sia molto più ridotto.
Espressioni regolari generate dall'origine
La generazione di origine per le espressioni regolari è disponibile in .NET 7 e versioni successive. Il generatore di origine genera come codice C# un'implementazione personalizzata basata su Regex
con logica simile a quella RegexOptions.Compiled
, che emette il linguaggio intermedio. Si ottengono tutti i vantaggi in termini di prestazioni della velocità effettiva di RegexOptions.Compiled
e di avvio di Regex.CompileToAssembly
, ma senza la complessità di CompileToAssembly
. L'origine generata fa parte del progetto, il che significa che è anche facilmente visualizzabile e sottoponibile a debug.
Dove possibile, usare le espressioni regolari generate dall'origine anziché compilare espressioni regolari usando l'opzione RegexOptions.Compiled. Per altre informazioni sulle espressioni regolari generate dall'origine, vedere Generatori di origini di espressioni regolari .NET.
La cache delle espressioni regolari
Per migliorare le prestazioni, il motore delle espressioni regolari gestisce una cache a livello di applicazione delle espressioni regolari compilate. La cache memorizza i modelli di espressione regolare che vengono usati solo nelle chiamate di metodo statico. I modelli di espressione regolare specificati per i metodi di istanza non vengono memorizzati. Caching evita la necessità di analizzare nuovamente un'espressione nel codice di alto livello ogni volta che viene usata.
Il numero massimo di espressioni regolari memorizzate nella cache è determinato dal valore della proprietà Regex.CacheSizestatic
(Shared
in Visual Basic). Per impostazione predefinita, il motore delle espressioni regolari memorizza nella cache fino a 15 espressioni regolari compilate. Se il numero di espressioni regolari compilate supera la dimensione della cache, l'espressione regolare usata meno di recente viene eliminata e viene memorizzata nella cache la nuova espressione regolare.
L'applicazione può riutilizzare le espressioni regolari in uno dei due modi seguenti:
- Usando un metodo statico dell'oggetto Regex per definire l'espressione regolare. Se si usa un criterio di espressione regolare che è già stato definito da un'altra chiamata di metodo statico, il motore delle espressioni regolari proverà a recuperarlo dalla cache. Se non è disponibile nella cache, il motore compilerà l'espressione regolare e lo aggiungerà alla cache.
- Usando ripetutamente un oggetto Regex esistente finché il modello di espressione regolare relativo è necessario.
A causa del sovraccarico di creazione di istanze di oggetti e di compilazione di espressioni regolari, la creazione e l'eliminazione rapide di numerosi oggetti Regex è un processo costoso. Per le applicazioni che usano un numero elevato di espressioni regolari, è possibile ottimizzare le prestazioni con chiamate a metodi statici Regex
e aumentando eventualmente la dimensione della cache delle espressioni regolari.