Quando grep
o sed
vengono utilizzati con l'opzione --extended-regexp
e il modello {1,9999}
fa parte della regexp utilizzata, le prestazioni di questi comandi diminuiscono. Per essere più chiari, di seguito vengono applicati alcuni test. [1] [2]
- Le prestazioni relative di
grep -E
,egrep
edsed -E
è quasi uguale, quindigrep -E
vengono forniti solo i test effettuati .
Test 1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
Test 2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
Test 3
$ time grep -E '[0123456789] {1.9999}' </ dev / null > 21m43.947 reali
Test 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 è la ragione di questa significativa differenza nelle prestazioni?
time grep -E '[0-9]{1,99}' </dev/null
contro time grep -E '[0-9]{1,9999}' </dev/null
. Anche senza input , il secondo comando è lento (su 16.04). Come previsto, omettere -E
e fuggire {
e }
comportarsi allo stesso modo e sostituirsi -E
con -P
non è lento (PCRE è un motore diverso). Più interessante è quanto più veloce [0-9]
è più .
, x
e persino [0123456789]
. Con uno di questi e {1,9999}
, grep
consuma un'enorme quantità di RAM; Non ho osato lasciarlo funzionare per più di ~ 10min.
{
}
sono '
'
citati ; il guscio li passa invariato a grep
. Comunque, {1,9999}
sarebbe un'espansione molto veloce e semplice . La shell lo espanderebbe a 1 9999
.
ps
e top
per verificare che grep
gli argomenti previsti fossero passati e che non bash
consumassero molta RAM e CPU. Mi aspetto grep
ed sed
entrambi uso le funzioni regex POSIX implementate in libc per la corrispondenza BRE / ERE; Non avrei dovuto parlare del grep
design in modo specifico, tranne nella misura in cui gli grep
sviluppatori hanno scelto di utilizzare quella libreria.
time grep ... < /dev/null
, in modo che le persone non confondano il problema reale con i dati forniti grep
e altre cose estranee.
[0-9]+
)