Compartilhar via


Compilação e Reuso

Você pode otimizar o desempenho de aplicativos que usam expressões regulares de forma extensiva ao entender como o mecanismo de expressões regulares compila expressões e ao entender como expressões regulares são armazenados em cache. Este tópico aborda ambos a compilação e o cache.

Expressões regulares compilados

Por padrão, o mecanismo de expressões regulares compila uma expressão regular como uma sequência de instruções internas (esses são códigos de alto nível que são diferentes das linguagens Microsoft Intermediate Language ou MSIL). Quando o mecanismo executa um expressão regular, ele interpreta os códigos internos.

Se um Regex objeto é construído com o RegexOptions.Compiled opção, ela compila a expressão regular para código explícito de MSIL em vez de instruções interno expressão regular de alto nível. Isso permite que o compilador just-in-time (JIT) do .NET Framework converta a expressão para código nativo da máquina para maior desempenho.

No entanto, MSIL gerado não pode ser descarregado. A única maneira para descarregar o código é descarregar um domínio de aplicativo inteiro (ou seja, para descarregar todos os seus códigos do aplicativo). Na verdade, uma vez que uma expressão regular é compilada com a opção RegexOptions.Compiled, o .NET Framework nunca libera os recursos usados pela expressão compilada, mesmo se a expressão regular foi criada por um objeto Regex que é liberado para coleta de lixo.

Você deve ser cuidadoso para limitar o número de expressões regulares diferentes que você compila com a opção RegexOptions.Compiled para evitar que consuma muitos recursos. Se um aplicativo deve usar um número grande ou desvinculado de expressões regulares, cada expressão deve ser interpretada, não compilada. No entanto, se um número pequeno de expressões regulares forem usadas repetidamente, elas devem ser compiladas com RegexOptions.Compiled para obter um melhor desempenho. Uma alternativa é usar expressões regulares pré-compilados. Você pode compilar todas as suas expressões em uma DLL reutilizável, usando o método CompileToAssembly. Isso evita a necessidade para a compilação em tempo de execução enquanto ainda beneficia a partir da velocidade das expressões regulares compiladas.

O cache de expressões regulares

Para melhorar o desempenho, o mecanismo de expressões regulares mantém um cache em nível de aplicativo de expressões regulares compiladas. O cache armazena os padrões de expressões regularesque são usados somente em chamadas de métodos estáticos. (Padrões de Expressão regular fornecidos para métodos da instância não serão armazenados em cache.) Isso evita a necessidade de analisar novamente uma expressão no código de bytes de alto nível cada vez que ele é usado.

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

Observação importanteImportante

A forma como expressões regulares são armazenadas em cache no .NET Framework versão 2.0 difere significativamente das versões 1.0 e 1.1 do .NET Framework.No .NET Framework 1.0 e 1.1, todas expressões regulares, tanto aquelas usadas nas chamadas de métodos estáticos quanto aquelas usadas em chamadas de métodos de instância, são armazenadas em cache.A cache será automaticamente expandida para armazenar novas expressões regulares.No .NET Framework 2.0, apenas expressões regulares usadas em chamadas de métodos estáticos são armazenadas em cache.Por padrão, as últimas 15 expressões regulares são armazenadas em cache, embora o tamanho da cache possa ser ajustada ao definir o valor da propriedade CacheSize.

O aplicativo pode tirar proveito de expressões regulares pré-compiladas em uma das duas maneiras a seguir:

  • Usando um método estático do objeto Regex para definir a expressão regular. Se você está usando padrões de expressões regulares que já foram peviamente definidas em outras chama de método estático, o mecanismo de expressões regulares irá recuperá-lo da cache. Caso contrário, o mecanismo compilará as expressões regulares e as adiciona à cache.

  • Reutilizando um objeto Regex desde que o padrão de expressão regular é necessário.

Devido a sobrecarga da instanciação de um objeto e da 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 diferente de expressões regulares, você pode otimizar o desempenho usando chamadas para métodos estáticos Regex e possivelmente aumentar o tamanho da cache de expressão regular.

Consulte também

Conceitos

Expressões Regulares do .NET Framework