Cuando grep
o sed
se usan con la opción --extended-regexp
y el patrón {1,9999}
es una parte de la expresión regular que se usa, el rendimiento de estos comandos se vuelve bajo. Para ser más claro, a continuación se aplican algunas pruebas. [1] [2]
- El rendimiento relativo de
grep -E
,egrep
ysed -E
es casi igual, por lo que solo se proporcionan las pruebas realizadasgrep -E
.
Prueba 1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
Prueba 2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
Prueba 3
$ time grep -E '[0123456789] {1,9999}' </ dev / null > real 21m43.947s
Prueba 4
$ time grep -E '[0123456789]+' < /dev/null
$ time grep -E '[0123456789]*' < /dev/null
$ time grep -E '[0123456789]{1,}' < /dev/null
$ time grep -P '[0123456789]{1,9999}' < /dev/null
real 0m0.002s
¿Cuál es la razón de esta diferencia significativa de rendimiento?
time grep -E '[0-9]{1,99}' </dev/null
vs time grep -E '[0-9]{1,9999}' </dev/null
. Incluso sin entrada , el segundo comando es lento (en 16.04). Como se esperaba, omitir -E
y escapar {
y se }
comporta igual y reemplazar -E
con -P
no es lento (PCRE es un motor diferente). Lo más interesante es cuánto más rápido [0-9]
es que .
, x
y hasta [0123456789]
. Con cualquiera de esos y {1,9999}
, grep
consume una gran cantidad de RAM; No me he atrevido a dejarlo correr por más de ~ 10 minutos.
{
}
se '
'
citan ; el caparazón los pasa sin cambios grep
. De todos modos, {1,9999}
sería una expansión de llaves muy rápida y simple . El shell simplemente lo expandiría a 1 9999
.
ps
y top
para verificar grep
se pasaron los argumentos esperados y que, no bash
, consume mucha RAM y CPU. Espero grep
y sed
ambos usan las funciones de expresiones regulares POSIX implementadas en libc para la coincidencia BRE / ERE; Realmente no debería haber hablado grep
específicamente del diseño, excepto en la medida en que los grep
desarrolladores eligieron usar esa biblioteca.
time grep ... < /dev/null
, para que las personas no combinen el problema real con los datos que se envían grep
y otras cosas extrañas.
[0-9]+
también)