Compilação e reutilização em expressões regulares

Você pode otimizar o desempenho de aplicativos que fazem uso intensivo de expressões regulares compreendendo como o mecanismo de expressões regulares compila expressões e como as expressões regulares são armazenadas em cache. Este tópico discute a compilação e o cache.

Expressões regulares compiladas

Por padrão, o mecanismo de expressão regular compila uma expressão regular em uma sequência de instruções internas (esses são códigos de alto nível que são diferentes da Common Intermediate Language, ou CIL). Quando o mecanismo executa uma expressão regular, ele interpreta os códigos internos.

Se um objeto Regex for construído com a opção RegexOptions.Compiled, ele compilará a expressão regular em código CIL explícito em vez de instruções internas de expressão regular de alto nível. Isso permite que o compilador JIT (just-in-time) do .NET converta a expressão para um código de computador nativo para um melhor desempenho. O custo da construção do objeto Regex pode ser maior, mas o custo de executar correspondências com ele provavelmente é muito menor.

Uma alternativa é usar expressões regulares pré-compiladas. Você pode compilar todas as suas expressões em uma DLL reutilizável usando o método CompileToAssembly. Isso evita a necessidade de compilar em tempo de execução e ainda se beneficia da velocidade das expressões regulares compiladas.

Cache de expressões regulares

Para melhorar o desempenho, o mecanismo de expressões regulares mantém um cache em todo o aplicativo com as expressões regulares compiladas. O cache armazena padrões de expressões regulares 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.) Isso evita a necessidade de reanalisar uma expressão em código de bytes de alto nível sempre que ela for usada.

O número máximo de expressões regulares em cache é determinado pelo valor da propriedade static (Shared no Visual Basic) Regex.CacheSize. Por padrão, o mecanismo de expressões regulares armazena em cache até 15 expressões regulares compiladas. Se o número de expressões regulares compiladas ultrapassar o tamanho do cache, a expressão regular menos utilizada recentemente será descartada e a nova expressão regular será armazenada em cache.

Seu aplicativo pode aproveitar expressões regulares pré-compiladas de uma das duas maneiras a seguir:

  • Usando um método estático do objeto Regex para definir a expressão regular. Se você estiver usando um padrão de expressão regular já definido em outra chamada de método estático, o mecanismo de expressões regulares o recuperará do cache. Caso contrário, o mecanismo compilará a expressão regular e a adicionará ao cache.

  • Reutilizando um objeto Regex existente enquanto o padrão de expressão regular for necessário.

Devido à sobrecarga da instanciação de objetos e à compilação da expressão regular, criar e destruir rapidamente vários objetos Regex é um processo muito caro. Para aplicativos que usam um grande número de expressões regulares diferentes, você pode otimizar o desempenho usando chamadas para métodos Regex estáticos e, possivelmente, aumentando o tamanho do cache de expressão regular.

Confira também