Quando grepo sedvengono utilizzati con l'opzione --extended-regexpe 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,egrepedsed -Eè quasi uguale, quindigrep -Evengono 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/nullcontro time grep -E '[0-9]{1,9999}' </dev/null. Anche senza input , il secondo comando è lento (su 16.04). Come previsto, omettere -Ee fuggire {e }comportarsi allo stesso modo e sostituirsi -Econ -Pnon è lento (PCRE è un motore diverso). Più interessante è quanto più veloce [0-9] è più ., xe persino [0123456789]. Con uno di questi e {1,9999}, grepconsuma 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.
pse topper verificare che grepgli argomenti previsti fossero passati e che non bashconsumassero molta RAM e CPU. Mi aspetto greped sedentrambi uso le funzioni regex POSIX implementate in libc per la corrispondenza BRE / ERE; Non avrei dovuto parlare del grepdesign in modo specifico, tranne nella misura in cui gli grepsviluppatori hanno scelto di utilizzare quella libreria.
time grep ... < /dev/null, in modo che le persone non confondano il problema reale con i dati forniti grepe altre cose estranee.
[0-9]+)