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, o 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.

questionAnswers(3)

yourAnswerToTheQuestion