Cuando grepo sedse usan con la opción --extended-regexpy 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,egrepysed -Ees 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/nullvs time grep -E '[0-9]{1,9999}' </dev/null. Incluso sin entrada , el segundo comando es lento (en 16.04). Como se esperaba, omitir -Ey escapar {y se }comporta igual y reemplazar -Econ -Pno es lento (PCRE es un motor diferente). Lo más interesante es cuánto más rápido [0-9] es que ., xy hasta [0123456789]. Con cualquiera de esos y {1,9999}, grepconsume 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.
psy toppara verificar grepse pasaron los argumentos esperados y que, no bash, consume mucha RAM y CPU. Espero grepy sedambos usan las funciones de expresiones regulares POSIX implementadas en libc para la coincidencia BRE / ERE; Realmente no debería haber hablado grepespecíficamente del diseño, excepto en la medida en que los grepdesarrolladores eligieron usar esa biblioteca.
time grep ... < /dev/null, para que las personas no combinen el problema real con los datos que se envían grepy otras cosas extrañas.
[0-9]+también)