Partilhar via


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 Regexcom 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.

Consulte também