Czy grep używa pamięci podręcznej w celu przyspieszenia wyszukiwania?

36

Zauważyłem, że kolejne uruchomienia greptego samego zapytania (a także innego zapytania, ale w tym samym pliku) są znacznie szybsze niż pierwsze uruchomienie (efekt jest łatwo zauważalny podczas przeszukiwania dużego pliku).

Sugeruje to, że grep używa pewnego rodzaju buforowania struktur używanych do wyszukiwania, ale nie mogłem znaleźć odnośnika w Internecie.

Jaki mechanizm umożliwia grepszybsze zwracanie wyników w kolejnych wyszukiwaniach?

Lazer
źródło

Odpowiedzi:

60

Nie grep jako taki, ale sam system plików często buforuje ostatnio odczytywane dane, co powoduje, że później działa szybciej, ponieważ grep skutecznie szuka w pamięci zamiast na dysku.

PaulRein
źródło
2
Zgadzam się. Przy pierwszym grepowaniu pliku kod systemu plików ładuje plik z dysku do pamięci podręcznej; gdy ponownie go grepujesz wkrótce potem, nie ma jeszcze czasu, aby wygasł z bufora. Sprawdź, czy istnieje sposób ręcznego opróżnienia pamięci podręcznej systemu plików, a następnie porównaj przed i po porach.
Shadur
3
@Shadur - istnieje sposób. Zobacz unix.stackexchange.com/questions/8398/…
mattdm
3
Nie ma praktycznej różnicy, ale jest to pamięć podręczna jądra, a nie system plików.
pboin
@pboin Ok, wziąłem mały skrót. Oczywiście jest to część jądra, która obsługuje system plików, który sam buforuje, a nie sam system plików (na dysku). Pedantyczny, ale prawdziwy. :)
PaulRein
19

Systemy Linux i * NIX korzystają z różnych pamięci podręcznych znajdujących się między systemami plików (wyodrębnionymi przez VFS) a procesami na poziomie użytkownika. Więc to nie jest grep i to nie system plików buforuje - to system operacyjny.

Pamięć podręczna odpowiedzialna za wydajność grep to pamięć podręczna buforu VFS. Inne pamięci podręczne są przeznaczone dla i-węzłów i katalogów, ale te nie wchodzą tutaj w grę.

Aby uzyskać więcej informacji, zobacz: Projekt dokumentacji systemu Linux: 9.2 Wirtualny system plików http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
źródło
5
Jeśli wykonujesz rekurencyjny grep, pamięci podręczne i-węzłów i zębatki mają zauważalną różnicę. W teście grep w ciągu /usr/includeokoło ~ 16,4 sekundy w moim systemie zrzucił wszystkie pamięci podręczne. Wszystko buforowane, około 0,3 sekundy. Jeśli upuszczę tylko pamięć podręczną strony (która zawiera pamięć podręczną bufora), zajmuje to około 14,3 sekundy. Jeśli opuszczę pamięć podręczną strony i upuszczę pamięć podręczną dentysty / i-węzła, będzie to około 12 sekund.
mattdm,
@mattdm, to interesujące. Jak upuściłeś skrzynki?
JRW