Byłem bardzo zaskoczony, gdy dodałem opcję do grep
, która może spowolnić wyszukiwanie o 50x razy. Przetestowałem to na dwóch różnych maszynach z tym samym wynikiem. Jestem ciekawy, jak znaleźć wytłumaczenie ogromnej różnicy w wydajności.Dlaczego "grep --ignore-case" 50 razy wolniej?
Chciałbym również zobaczyć alternatywną komendę grep dla wyszukiwań niewrażliwych na wielkość liter. Nie potrzebuję wyrażeń regularnych, tylko poprawiono wyszukiwanie ciągów znaków. Pierwszy plik testowy będzie 50 MB plik tekstowy z niektórych danych manekina, można użyć następującego kodu, aby go wygenerować:
Tworzenie test.txt
yes all work and no play makes Jack a dull boy | head -c 50M > test.txt
echo "Jack is no fun" >> test.txt
echo "Jack is no Fun" >> test.txt
Demonstracja
Poniżej znajduje się pokaz powolności. Po dodaniu opcji --ignore-case
polecenie staje się 57 razy wolniejsze.
$ time grep fun test.txt
all work and no plJack is no fun
real 0m0.061s
$ time grep --ignore-case fun test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m3.498s
możliwych wyjaśnień
googlowania wokół znalazłem dyskusję na grep jest powolny w locale UTF-8. Przeprowadziłem następujący test i przyspieszyłem. Domyślnym ustawieniem narodowym na moim komputerze jest en_US.UTF-8
, więc ustawienie go na POSIX
wydaje się, że dokonało rozruchu wydajności, ale teraz oczywiście nie mogę poprawnie przeszukiwać tekstu Unicode, co jest niepożądane. Jest także nadal 2,5 razy wolniejszy.
$ time LANG=POSIX grep --ignore-case fun test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m0.142s
Alternatywy
Mogliśmy użyć Perl zamiast tego jest szybsze, ale nadal 5,5 razy szybciej niż wrażliwej sprawy grep. A powyższy POSIX grep jest około dwa razy szybszy.
$ time perl -ne '/fun/i && print' test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m0.388s
Chciałbym więc znaleźć szybką poprawną alternatywę i wyjaśnienie, jeśli ktoś ją ma.
AKTUALIZACJA - CentOS
dwie maszyny, które testowano jak powyżej były Ubuntu jeden 11.04 (Natty narwala inni) 12,04 (dokładne Pangolin). Uruchomienie tych samych testów na komputerze CentOS 5.3 daje następujące interesujące wyniki. Wyniki osiągnięte w obu przypadkach są niemal identyczne. Teraz CentOS 5.3 został wydany w styczniu 2009 roku i działa pod kontrolą grep 2.5.1, podczas gdy Ubuntu 12.04 uruchamia grep 2.10. Mogą więc wystąpić zmiany w nowej wersji i różnice w obu dystrybucjach.
$ time grep fun test.txt
Jack is no fun
real 0m0.026s
$ time grep --ignore-case fun test.txt
Jack is no fun
Jack is no Fun
real 0m0.027s
można przedstawić podsumowanie? –