Estou realmente surpreso com a funcionalidade do GREP no shell, antes eu costumava usar o método substring em java, mas agora uso o GREP para ele e ele executa em questão de segundos, é incrivelmente mais rápido do que o código java que eu costumava escrever. (de acordo com minha experiência, posso estar errado)
Dito isso, não consegui descobrir como isso está acontecendo. também não há muito disponível na web.
Alguém pode me ajudar com isso?
Respostas:
Supondo que sua pergunta seja
GNU grep
específica. Aqui está uma nota do autor, Mike Haertel:Esta resposta é um subconjunto das informações obtidas a partir daqui .
fonte
Para acrescentar à excelente resposta de Steve.
Pode não ser amplamente conhecido, mas o grep é quase sempre mais rápido ao usar o grep para uma string de padrão mais longa do que uma curta, porque em um padrão mais longo, Boyer-Moore pode pular para frente em passos mais longos para alcançar velocidades sublineares ainda melhores :
Exemplo:
A forma mais longa é 35% mais rápida!
Por quê? Boyer-Moore constrói uma tabela de salto para a frente da string de padrão e sempre que há uma incompatibilidade, ele escolhe o salto mais longo possível (do último caractere ao primeiro) antes de comparar um único caractere na entrada com o caractere na tabela de salto.
Aqui está um vídeo explicando Boyer Moore (crédito para kommradHomer)
Outro equívoco comum (para GNU grep) é que
fgrep
é mais rápido quegrep
.f
infgrep
não significa 'rápido', significa 'fixo' (consulte a página de manual) e, como ambos são o mesmo programa e usam Boyer-Moore , não há diferença de velocidade entre eles ao pesquisar por fixo strings sem caracteres especiais regexp. O único uso razão Ifgrep
é quando há um char especial regexp (como.
,[]
ou*
) Eu não quero que ele seja interpretado como tal. E mesmo assim a forma mais portátil / padrão degrep -F
é preferívelfgrep
.fonte
xs.txt
contenha 100000000 'x's, e você temgrep yx xs.txt
, então, na verdade, ele não consegue encontrar uma correspondência mais cedo do que se você encontrassegrep yxxxxxxxxxxxxxxxxxxx xs.txt
. A melhoria de Boyer-Moore-Horspool para Boyer-Moore melhora o salto à frente nesse caso, mas provavelmente não serão apenas três instruções de máquina no caso geral.grep/fgrep/egrep
era apenas hardlinks para o mesmo executável se foi. Eles (e outras extensões, como osz*grep
bz*grep
utilitários que descompactam na hora), são agora pequenos invólucros de shellgrep
. Alguns comentários históricos interessantes sobre a troca entre um único executável e wrappers de shell podem ser encontrados neste commit: git.savannah.gnu.org/cgit/grep.git/commit/…