Compilazione e riutilizzo 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. In questo argomento vengono descritte sia la compilazione che la memorizzazione nella cache.

Espressioni regolari compilate

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.

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.

Un'alternativa consiste nell'usare espressioni regolari precompilate. È possibile compilare tutte le espressioni in una DLL riutilizzabile usando il metodo CompileToAssembly. Questo evita la dover eseguire la compilazione in fase di esecuzione pur consentendo di usufruire della velocità delle espressioni regolari compilate.

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. Questo 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 molto 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.

Vedi anche