Venho usando com grep -i
mais frequência e descobri que é mais lento que o egrep
equivalente, onde eu ligo contra a letra maiúscula ou minúscula de cada letra:
$ time grep -iq "thats" testfile
real 0m0.041s
user 0m0.038s
sys 0m0.003s
$ time egrep -q "[tT][hH][aA][tT][sS]" testfile
real 0m0.010s
user 0m0.003s
sys 0m0.006s
Faz grep -i
testes adicionais que egrep
não?
grep
performance
tildearrow
fonte
fonte
grep
contrário, para garantir que você não esteja medindo a diferença entre o armazenamento em disco do disco.egrep
é mais rápido do quegrep
até eu definirLANG=C
e, então, os dois são praticamente os mesmos.user
horas (que não inclui o tempo de espera do disco). Há uma ordem de magnitude na diferença.Respostas:
grep -i 'a'
é equivalente agrep '[Aa]'
um código de idioma somente ASCII. Em um código de idioma Unicode, as equivalências e as conversões de caracteres podem ser complexas; portanto, égrep
necessário um trabalho extra para determinar quais caracteres são equivalentes. A configuração de localidade relevante éLC_CTYPE
, que determina como os bytes são interpretados como caracteres.Na minha experiência, o GNU
grep
pode ser lento quando invocado em um código de idioma UTF-8. Se você souber que está procurando apenas caracteres ASCII, invocá-lo em um código de idioma somente ASCII pode ser mais rápido. Eu espero issoproduziria intervalos indistinguíveis.
Dito isto, não consigo reproduzir sua descoberta com o GNU
grep
no Debian jessie (mas você não especificou seu arquivo de teste). Se eu definir um código de idioma ASCII (LC_ALL=C
),grep -i
é mais rápido. Os efeitos dependem da natureza exata da sequência, por exemplo, uma sequência com caracteres repetidos reduz o desempenho (o que é esperado ).fonte
-i
sem distinção entre maiúsculas e minúsculas ( ) com localidades multibyte deve ter melhorado na 2.17 .grep -i 'a'
é equivalente agrep '[Aa]'
qualquer local. O exemplo adequado égrep -i 'i'
o que é ougrep '[Ii]'
ougrep '[İi]'
(Maiúsculas I com ponto acima, L + 130, localidade turco). No entanto, não há maneira eficientegrep
de encontrar essa classe de equivalência, dada uma localidade.Por curiosidade, testei isso em um sistema Arch Linux:
E algumas estatísticas são cortesia de Existe uma maneira de obter o mínimo, o máximo, a mediana e a média de uma lista de números em um único comando? :
Estou no
en_GB.utf8
local, mas os horários são quase indistinguíveis.fonte