Wenn grepoder sedmit der Option verwendet werden --extended-regexpund das Muster {1,9999}Teil des verwendeten regulären Ausdrucks ist, wird die Leistung dieser Befehle gering. Um klarer zu sein, werden im Folgenden einige Tests angewendet. [1] [2]
- Die relative Leistung
grep -E,egrepundsed -Eist fast gleich, so dass nur der Test, der mit gemacht wurdengrep -Ezur Verfügung gestellt.
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
> echte 21m43.947s
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
Was ist der Grund für diesen signifikanten Leistungsunterschied?
time grep -E '[0-9]{1,99}' </dev/nullgegenüber time grep -E '[0-9]{1,9999}' </dev/null. Auch ohne Eingabe ist der zweite Befehl langsam (am 16.04.). Wie erwartet ist das Weglassen -Eund Entkommen {und }das gleiche Verhalten und Ersetzen -Edurch -Pnicht langsam (PCRE ist eine andere Engine). Besonders interessant ist , wie viel schneller [0-9] ist als ., xund sogar [0123456789]. Bei jedem dieser und {1,9999}, grepverbraucht eine große Menge an RAM; Ich habe es nicht gewagt, es länger als ~ 10 Minuten laufen zu lassen.
{ }werden ' 'zitiert ; Die Shell übergibt sie unverändert an grep. Auf jeden {1,9999}Fall wäre eine sehr schnelle und einfache Klammererweiterung . Die Shell würde es einfach erweitern 1 9999.
psund topüberprüft, ob sie grepübergeben wurden und dass sie nicht bashviel RAM und CPU verbrauchen. Ich erwarte grepund sedbeide verwenden die in libc implementierten POSIX-Regex-Funktionen für den BRE / ERE-Abgleich. Ich hätte eigentlich nicht speziell über Design sprechen sollen , es sei denn, die Entwickler haben sich für diese Bibliothek entschieden. grepgrep
time grep ... < /dev/null, damit die Leute das eigentliche Problem nicht mit den eingespeisten Daten grepund anderen irrelevanten Dingen in Konflikt bringen .
[0-9]+