Używam grep -i
częściej i odkryłem, że jest wolniejszy niż jego egrep
odpowiednik, gdzie dopasowuję się do dużej lub małej litery każdej litery:
$ time grep -iq "thats" testfile
real 0m0.041s
user 0m0.038s
sys 0m0.003s
$ time egrep -q "[tT][hH][aA][tT][sS]" testfile
real 0m0.010s
user 0m0.003s
sys 0m0.006s
Czy grep -i
wykonuje dodatkowe testy, które egrep
nie?
grep
performance
tylda
źródło
źródło
grep
odwrotnie, aby upewnić się, że nie mierzysz różnicy między buforowaniem dysku w pliku Flie.egrep
jest szybszy niżgrep
do momentu ustawienia,LANG=C
a potem oba są mniej więcej takie same.user
czas (który nie obejmuje czasu oczekiwania na dysk). Różnica jest rzędu wielkości.Odpowiedzi:
grep -i 'a'
jest równoważne zgrep '[Aa]'
ustawieniami regionalnymi tylko ASCII. W ustawieniach regionalnych Unicode ekwiwalenty znaków i konwersje mogą być złożone, więcgrep
może być konieczne wykonanie dodatkowej pracy w celu ustalenia, które znaki są równoważne. Odpowiednie ustawienie regionalneLC_CTYPE
określa, w jaki sposób bajty są interpretowane jako znaki.Z mojego doświadczenia wynika, że GNU
grep
może działać wolno, gdy jest wywoływany w ustawieniach regionalnych UTF-8. Jeśli wiesz, że szukasz tylko znaków ASCII, wywoływanie go w ustawieniach tylko ASCII może być szybsze. oczekuję tegowytworzyłyby nierozróżnialne czasy.
To powiedziawszy, nie mogę odtworzyć twojego odkrycia z GNU
grep
na Debianie jessie (ale nie określiłeś pliku testowego). Jeśli ustawię ustawienia regionalne ASCII (LC_ALL=C
),grep -i
jest to szybsze. Efekty zależą od dokładnej natury łańcucha, na przykład łańcuch z powtarzającymi się znakami zmniejsza wydajność ( czego należy się spodziewać ).źródło
-i
) w ustawieniach wielobajtowych powinna poprawić się w 2.17 .grep -i 'a'
jest to równoważne zgrep '[Aa]'
dowolnym ustawieniem narodowym. Właściwym przykładem jestgrep -i 'i'
albogrep '[Ii]'
albogrep '[İi]'
(wielkie litery I z kropką powyżej, U + 130, ustawienia regionalne tureckie). Jednak nie ma skutecznego sposobu nagrep
znalezienie tej klasy równoważności w przypadku ustawień regionalnych.Z ciekawości przetestowałem to na systemie Arch Linux:
A potem niektóre statystyki dzięki uprzejmości Czy istnieje sposób, aby uzyskać minimalną, maksymalną, średnią i średnią z listy liczb w jednym poleceniu? :
Jestem na
en_GB.utf8
miejscu, ale czasy są prawie nie do odróżnienia.źródło