Por que as expressões regulares compiladas em C # são mais rápidas que os métodos equivalentes de string?
Toda vez que eu tenho que fazer operações simples de contenção ou substituição em strings, onde o termo que estou procurando é um valor fixo, eu acho que se eu pegar minha amostra de entrada e fazer algum perfil nela, usar uma expressão regular compilada é quase * sempre mais rápido do que usando o método equivalente da classe String.
Eu tentei comparar uma variedade de métodos (hs
é o "palheiro" para procurar,ndl
é a "agulha" para procurar,repl
é o valor de substituição.regex
é sempre criado com oRegexOptions.Compiled
opção):
hs.Replace( ndl, repl )
vsregex.Replace( hs, repl )
hs.Contains( ndl )
vsregex.IsMatch( hs )
Eu encontrei algumas discussões com foco emqual das duas técnicas são mais rápidas (1, 2, 3e muitos outros), mas essas discussões sempre parecem se concentrar em:
Use a versão de string para operações simples e regex para operações complexas (que, do ponto de vista do desempenho bruto, nem parece ser necessariamente uma boa ideia), ouExecute um teste e compare os dois (e, para testes equivalentes, a versão regex parece sempre ter um melhor desempenho).Eu não entendo como isso pode ser possível: como o mecanismo regex compara duas strings para correspondências de substring mais rapidamente que a versão de string equivalente? Isso parece valer para espaços de pesquisa muito pequenos ou muito grandes, ou termos de pesquisa pequenos ou grandes, ou se o termo de pesquisa ocorre cedo ou tarde no espaço de pesquisa.
Assim,porque são expressões regulares mais rápidas?
* Na verdade, osó No caso, eu consegui mostrar que a versão da string é mais rápida do que uma regex compilada quando pesquisando uma string vazia! Qualquer outro caso, de strings de caracteres simples a strings muito longas, é processado mais rapidamente por um regex compilado do que o método de string equivalente.
Atualizar: Adicionado uma cláusula para esclarecer que estou olhando para casos em que o termo de pesquisa é conhecido em tempo de compilação. Para operações dinâmicas ou únicas, a sobrecarga de compilar a expressão regular tenderá a distorcer os resultados em favor dos métodos de string.