Lo he estado usando con grep -i
más frecuencia y descubrí que es más lento que su egrep
equivalente, donde coincido con la letra mayúscula o 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
¿Hace grep -i
pruebas adicionales que egrep
no?
grep
performance
tildearrow
fuente
fuente
grep
revés para asegurarse de que no está midiendo la diferencia entre el almacenamiento en caché de disco de la mosca.egrep
es más rápido quegrep
hasta que configuréLANG=C
y luego ambos son más o menos lo mismo.user
tiempo (que no incluye el tiempo de espera para el disco). Hay un orden de magnitud en la diferencia.Respuestas:
grep -i 'a'
es equivalente agrep '[Aa]'
en un entorno local solo ASCII. En un entorno local Unicode, las equivalencias y conversiones de caracteres pueden ser complejas, por lo que esgrep
posible que tenga que hacer un trabajo adicional para determinar qué caracteres son equivalentes. La configuración regional relevante esLC_CTYPE
, que determina cómo se interpretan los bytes como caracteres.En mi experiencia, GNU
grep
puede ser lento cuando se invoca en un entorno local UTF-8. Si sabe que solo está buscando caracteres ASCII, invocarlo en una configuración regional solo ASCII puede ser más rápido. Eso esperoproduciría tiempos indistinguibles.
Dicho esto, no puedo reproducir su hallazgo con GNU
grep
en Debian jessie (pero no especificó su archivo de prueba). Si configuro un entorno local ASCII (LC_ALL=C
),grep -i
es más rápido. Los efectos dependen de la naturaleza exacta de la cadena, por ejemplo, una cadena con caracteres repetidos reduce el rendimiento ( que es de esperar ).fuente
-i
) con configuraciones regionales multibyte debería haber mejorado en 2.17 .grep -i 'a'
es equivalente agrep '[Aa]'
en cualquier localidad. El ejemplo correcto esgrep -i 'i'
cuál esgrep '[Ii]'
ogrep '[İi]'
(Mayúscula I con punto arriba, U + 130, configuración regional turca). Sin embargo, no hay una manera eficiente degrep
encontrar esta clase de equivalencia dada una localización.Por curiosidad, probé esto en un sistema Arch Linux:
Y luego algunas estadísticas cortesía de ¿Hay alguna forma de obtener el mínimo, el máximo, la mediana y el promedio de una lista de números en un solo comando? :
Estoy en el
en_GB.utf8
lugar, pero los tiempos son casi indistinguibles.fuente