Compilación y reutilización usar en expresiones regulares
Puede optimizar el rendimiento de aplicaciones que usan en gran medida las expresiones regulares al comprender cómo el motor de expresiones compila expresiones regulares y cómo estas se almacenan en caché. En este artículo se describe la compilación, la generación de origen y el almacenamiento en caché de expresiones regulares compiladas.
Expresiones regulares interpretadas
De manera predeterminada, el motor de expresiones regulares compila una expresión regular en una secuencia de instrucciones internas (son códigos de alto nivel diferentes del lenguaje intermedio común o CIL). Cuando el motor ejecuta una expresión regular, interpreta los códigos internos.
Expresiones regulares compiladas
Si un objeto Regex se construye con la opción RegexOptions.Compiled, compila la expresión regular en código CIL explícito en lugar de instrucciones internas de expresiones regulares de alto nivel. De este modo, el compilador Just-In-Time (JIT) de .NET puede convertir la expresión en código de equipo nativo para un mayor rendimiento. El costo de construir el objeto Regex puede ser mayor, pero el de realizar coincidencias con él puede ser mucho más pequeño.
Expresiones regulares generadas por el origen
La generación de origen para expresiones regulares está disponible en .NET 7 y versiones posteriores. El generador de código fuente emite, como código de C#, una implementación personalizada Regex
derivada con lógica similar a la que RegexOptions.Compiled
emite en IL. Se obtienen todas las ventajas de rendimiento de RegexOptions.Compiled
y las ventajas de inicio de Regex.CompileToAssembly
, pero sin la complejidad de CompileToAssembly
. El código fuente que se emite forma parte del proyecto, lo que significa que también es fácil de ver y depurar.
Siempre que sea posible, use expresiones regulares generadas por código fuente en lugar de compilar expresiones regulares mediante la opción RegexOptions.Compiled. Para más información sobre la generación de orígenes para expresiones regulares, consulte Generadores de orígenes de expresiones regulares de .NET.
La caché de expresiones regulares
Para mejorar el rendimiento, el motor de expresiones regulares mantiene una caché de la aplicación de expresiones regulares compiladas. La caché almacena los patrones de expresiones regulares que se usan solo en las llamadas al método estático. Nota: Los patrones de expresiones regulares proporcionados a métodos de instancia no se almacenan en caché. Almacenar esto en caché evita la necesidad de volver a analizar una expresión en código de bytes de alto nivel cada vez que se usa.
El valor de la propiedad static
(Shared
en Visual Basic) Regex.CacheSize determina el número máximo de expresiones regulares almacenadas en caché. De manera predeterminada, el motor de expresiones regulares almacena en caché hasta 15 expresiones regulares compiladas. Si el número de expresiones regulares compiladas supera el tamaño de la caché, se descarta la expresión regular usada menos recientemente y se almacena en caché la nueva expresión regular.
La aplicación puede reutilizar las expresiones regulares en una de las siguientes formas:
- Mediante el uso de un método estático del objeto Regex para definir la expresión regular. Si usa un patrón de expresión regular que ya ha definido otra llamada al método estático, el motor de expresiones regulares lo recuperará de la caché. Si no está disponible en la caché, el motor compilará la expresión regular y la agregará a la caché.
- Al volver a usar un objeto Regex existente siempre que sea necesario su patrón de expresión regular.
Debido a la sobrecarga de la creación de instancias de objeto y la compilación de expresiones regulares, crear y destruir rápidamente numerosos objetos Regex es un proceso muy costoso. Para aplicaciones que usan un gran número de expresiones regulares diferentes, puede optimizar el rendimiento al realizar llamadas a métodos Regex
estáticos y posiblemente al aumentar el tamaño de la caché de expresiones regulares.