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.
If a Regex objeto é construído com o RegexOptions.Compiled opção, ela compila a expressão regular para código MSIL explícita em vez de instruções interno de alto nível de expressão regular. 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 importante: |
---|
T Ele forma que expressões regulares são armazenados em cache o .NET Versão do estrutura 2.0 é diferente sinal i ficant LY de o .NET estrutura versões 1.0 e 1.1 .Em o .NET Framework 1.0 e 1.1 , todas as expressões regulares , ambos os usados em chamadas de método estático e Esses usado em chamadas de método de instância, um Re armazenados em cache .T cache he i s automaticamente expandido para armazenar o novas expressões regulares .Em o .NET Framework 2.0, somente as expressões regulares utilizadas nas chamadas de método estático são armazenados em cache .Por padrão, as últimos 15 expressões regulares são armazenados em cache, Embora o dimensionar do cache pode ser ajustado por configuração o valor da CacheSize propriedade. |
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.