Quando grepou sedsão usados com a opção --extended-regexpe o padrão {1,9999}faz parte do regexp usado, o desempenho desses comandos se torna baixo. Para ser mais claro, abaixo são aplicados alguns testes. [1] [2]
- O desempenho relativo
grep -E,egrepesed -Eé quase igual, portanto, apenas o teste que foram feitas comgrep -Esão fornecidos.
Teste 1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
Teste 2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
Teste 3
$ time grep -E '[0123456789] {1,9999}' </ dev / null
> real 21m43.947s
Teste 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
Qual o motivo dessa diferença significativa de desempenho?
time grep -E '[0-9]{1,99}' </dev/nullvs. time grep -E '[0-9]{1,9999}' </dev/null. Mesmo sem entrada , o segundo comando é lento (em 16.04). Como esperado, omitir -Ee escapar {e }se comporta da mesma maneira e a substituição -Epor -Pnão é lenta (PCRE é um mecanismo diferente). O mais interessante é o quanto mais rápido [0-9] é que ., xe mesmo [0123456789]. Com qualquer um desses {1,9999}, grepconsome uma quantidade enorme de RAM; Não ousei deixá-lo funcionar por mais de ~ 10min.
{ }estão entre ' 'aspas ; a concha os passa inalterados grep. Enfim, {1,9999}seria uma expansão de chave muito rápida e simples . O shell iria apenas expandi-lo para 1 9999.
pse toppara verificar se grepforam transmitidos os argumentos esperados e se ele não bashconsome muita RAM e CPU. Eu espero grepe sedambos usam as funções de regex POSIX implementadas em libc para correspondência BRE / ERE; Eu realmente não deveria ter falado sobre grepdesign especificamente, exceto na medida em que os grepdesenvolvedores optaram por usar essa biblioteca.
time grep ... < /dev/null, para que as pessoas não confundam o problema real com os dados alimentados grepe outras coisas estranhas.
[0-9]+também)