Jestem naprawdę zdumiony funkcjonalnością GREP w powłoce, wcześniej używałem metody podciąg w Javie, ale teraz używam do tego GREP i wykonuje się w ciągu kilku sekund, jest niesamowicie szybszy niż kod Java, który pisałem. (z mojego doświadczenia mogę się jednak mylić)
Biorąc to pod uwagę, nie byłem w stanie dowiedzieć się, jak to się dzieje? niewiele jest też dostępnych w sieci.
Czy ktoś może mi w tym pomóc?
Odpowiedzi:
Zakładając, że Twoje pytanie dotyczy
GNU grep
konkretnie. Oto uwaga od autora, Mike'a Haertela:Ta odpowiedź jest podzbiorem informacji zaczerpniętych stąd .
źródło
Aby dodać do doskonałej odpowiedzi Steve'a.
Być może nie jest to powszechnie znane, ale grep jest prawie zawsze szybszy podczas grepowania dłuższego wzoru niż krótkiego, ponieważ w dłuższym wzorze Boyer-Moore może przeskoczyć do przodu w dłuższych krokach, aby osiągnąć jeszcze lepsze prędkości podliniowe :
Przykład:
Dłuższa forma jest o 35% szybsza!
Dlaczego? Boyer-Moore konstruuje tablicę pomijania do przodu z łańcucha wzorca, a gdy występuje niedopasowanie, wybiera najdłuższe możliwe pominięcie (od ostatniego znaku do pierwszego) przed porównaniem pojedynczego znaku na wejściu do znaku w tabeli pominięcia.
Oto wideo wyjaśniające Boyer Moore (Credit to kommradHomer)
Innym powszechnym nieporozumieniem (w przypadku GNU grep) jest to, że
fgrep
jest szybszy niżgrep
.f
infgrep
nie oznacza `` fast '', oznacza `` fixed '' (patrz strona podręcznika), a ponieważ oba są tym samym programem i oba używają Boyer-Moore , nie ma różnicy w szybkości między nimi podczas wyszukiwania ustalonych- ciągi bez znaków specjalnych wyrażenia regularnego. Jedynym powodem, dla którego użyciefgrep
jest wtedy, gdy istnieje regexp specjalnym char (jak.
,[]
lub*
) Nie ma to być interpretowane jako takie. I nawet wtedy bardziej przenośna / standardowa formagrep -F
jest preferowanafgrep
.źródło
xs.txt
zawiera 100000000 'x, a zrobisz togrep yx xs.txt
, wtedy faktycznie nie znajdzie dopasowania wcześniej niż gdybyś to zrobiłgrep yxxxxxxxxxxxxxxxxxxx xs.txt
. Ulepszenie Boyer-Moore-Horspool do Boyer-Moore poprawia w tym przypadku skok do przodu, ale prawdopodobnie nie będą to tylko trzy instrukcje maszynowe w ogólnym przypadku.grep/fgrep/egrep
było wszystkimi twardymi dowiązaniami do tego samego pliku wykonywalnego, minęły. One (i inne rozszerzenia, takie jak narzędzia,z*grep
bz*grep
które dekompresują się w locie), są teraz małymi opakowaniamigrep
. Kilka interesujących komentarzy historycznych na temat przełączania się między pojedynczym plikiem wykonywalnym a opakowaniami powłoki można znaleźć w tym zatwierdzeniu: git.savannah.gnu.org/cgit/grep.git/commit/…