Compilação e reutilização em expressões regulares
Você pode otimizar o desempenho de aplicativos que fazem uso extensivo de expressões regulares entendendo como o mecanismo de expressão regular compila expressões e como expressões regulares são armazenadas em cache. Este artigo discute a compilação, a geração de código-fonte e o cache de expressões regulares compiladas.
Expressões regulares interpretadas
Por padrão, o mecanismo de expressão regular compila uma expressão regular para uma sequência de instruções internas (são códigos de alto nível que são diferentes da linguagem intermediária comum, ou CIL). Quando o mecanismo executa uma expressão regular, ele interpreta os códigos internos.
Expressões regulares compiladas
Se um Regex objeto é construído com a RegexOptions.Compiled opção, ele compila a expressão regular para código CIL explícito em vez de instruções internas de expressão regular de alto nível. Isso permite que . Compilador just-in-time (JIT) da NET para converter a expressão em código de máquina nativo para maior desempenho. O custo de construção do Regex objeto pode ser maior, mas o custo de realizar correspondências com ele provavelmente será muito menor.
Expressões regulares geradas pela fonte
A geração de origem para expressões regulares está disponível no .NET 7 e versões posteriores. O gerador de código-fonte emite, como código C#, uma implementação derivada personalizada Regex
com lógica semelhante à que RegexOptions.Compiled
emite em IL. Você obtém todos os benefícios de desempenho de taxa de RegexOptions.Compiled
transferência e os benefícios iniciais do Regex.CompileToAssembly
, mas sem a complexidade do CompileToAssembly
. A fonte emitida faz parte do seu projeto, o que significa que também é facilmente visível e depurável.
Sempre que possível, use expressões regulares geradas pelo código-fonte em vez de compilar expressões regulares usando a RegexOptions.Compiled opção. Para obter mais informações sobre expressões regulares geradas pela fonte, consulte Geradores de fonte de expressão regular do .NET.
O cache de expressões regulares
Para melhorar o desempenho, o mecanismo de expressão regular mantém um cache de expressões regulares compiladas em todo o aplicativo. O cache armazena padrões de expressão regular que são usados somente em chamadas de método estático. (Os padrões de expressão regular fornecidos aos métodos de instância não são armazenados em cache.) O cache evita a necessidade de analisar uma expressão em código de byte de alto nível cada vez que ela é usada.
O número máximo de expressões regulares armazenadas em cache é determinado pelo valor da static
propriedade (Shared
no Visual Basic Regex.CacheSize ). Por padrão, o mecanismo de expressão regular armazena em cache até 15 expressões regulares compiladas. Se o número de expressões regulares compiladas exceder o tamanho do cache, a expressão regular usada menos recentemente será descartada e a nova expressão regular será armazenada em cache.
Seu aplicativo pode reutilizar expressões regulares de uma das duas maneiras a seguir:
- Usando um método estático do Regex objeto para definir a expressão regular. Se você estiver usando um padrão de expressão regular que já tenha sido definido por outra chamada de método estático, o mecanismo de expressão regular tentará recuperá-lo do cache. Se ela não estiver disponível no cache, o mecanismo compilará a expressão regular e a adicionará ao cache.
- Reutilizando um objeto existente Regex , desde que seu padrão de expressão regular seja necessário.
Devido à sobrecarga de instanciação de objetos e compilação de expressões regulares, criar e destruir rapidamente vários Regex objetos é um processo caro. Para aplicativos que usam um grande número de expressões regulares diferentes, você pode otimizar o desempenho usando chamadas para métodos estáticos Regex
e, possivelmente, aumentando o tamanho do cache de expressões regulares.