Gdy greplub sedsą używane z opcją, --extended-regexpa wzorzec {1,9999}jest częścią używanego wyrażenia regularnego, wydajność tych poleceń staje się niska. Aby być bardziej zrozumiałym, poniżej zastosowano kilka testów. [1] [2]
- Względna wydajność
grep -E,egrepised -Ejest prawie równa, więc tylko testy, które zostały wykonane zgrep -Esą świadczone.
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
$ grep -E '[0123456789] {1,9999}' </ dev / null
> prawdziwe 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
Jaki jest powód tak znaczącej różnicy w wydajności?
time grep -E '[0-9]{1,99}' </dev/nullkontra time grep -E '[0-9]{1,9999}' </dev/null. Nawet bez danych wejściowych drugie polecenie jest powolne (16.04). Zgodnie z oczekiwaniami, z pominięciem -Ei ucieczki {i }zachowuje się tak samo i zastępując -Ez -Pnie wolno (PCRE jest inny silnik). Najciekawsze jest to, jak wiele szybciej [0-9] jest niż ., xa nawet [0123456789]. Z żadnym z tych i {1,9999}, grepzużywa ogromną ilość pamięci RAM; Nie odważyłem się, aby działał dłużej niż ~ 10 minut.
{ }są ' 'cytowane ; pocisk przekazuje je w niezmienionej postaci grep. W każdym razie {1,9999}byłoby to bardzo szybkie i proste rozszerzenie nawiasów klamrowych . Powłoka po prostu ją rozszerzy 1 9999.
psi topdo sprawdzenia, czy grepprzekazano oczekiwane argumenty i czy nie bashzużywa dużo pamięci RAM i procesora. Oczekuję grepi sedużywam funkcji regex POSIX zaimplementowanych w libc do dopasowywania BRE / ERE; Nie powinienem tak naprawdę mówić o grepprojektowaniu, chyba że grepprogramiści postanowili korzystać z tej biblioteki.
time grep ... < /dev/null, aby ludzie nie połączyli rzeczywistego problemu z danymi, które zostały dostarczone, grepi innymi istotami obcymi.
[0-9]+)