Verwendet grep einen Cache, um die Suche zu beschleunigen?

35

Ich habe festgestellt, dass nachfolgende grepAusführungen derselben Abfrage (und auch einer anderen Abfrage, aber derselben Datei) viel schneller sind als die erste Ausführung (der Effekt ist beim Durchsuchen einer großen Datei leicht erkennbar).

Dies legt nahe, dass grep eine Art Zwischenspeicherung der für die Suche verwendeten Strukturen verwendet, ich jedoch im Internet keinen Verweis finden konnte.

Welcher Mechanismus ermöglicht es grep, Ergebnisse bei nachfolgenden Suchvorgängen schneller zurückzugeben?

Laser
quelle

Antworten:

59

Nicht grep als solches, aber das Dateisystem selbst speichert häufig die zuletzt gelesenen Daten zwischen, was zu einer schnelleren Ausführung führt, da grep effektiv im Speicher anstatt auf der Festplatte sucht.

PaulRein
quelle
2
Ich stimme zu. Wenn Sie zum ersten Mal nach einer Datei suchen, lädt der Dateisystemcode die Datei von der Festplatte in den Cache. Wenn Sie es kurz darauf erneut prüfen, hatte es noch keine Zeit, aus dem Cache abzulaufen. Sehen Sie nach, ob es eine Möglichkeit gibt, den Dateisystem-Cache manuell zu leeren, und vergleichen Sie die Werte vor und nach dem Cache.
Shadur
3
@ Shadur - es gibt einen Weg. Siehe unix.stackexchange.com/questions/8398/…
mattdm
3
Es gibt keinen praktischen Unterschied, aber es ist ein Kernel-Cache, nicht das Dateisystem.
Pboin
@pboin Ok, ich habe eine kleine Abkürzung genommen. Natürlich ist es der Teil des Kernels, der das Dateisystem verwaltet, der das Caching vornimmt, nicht das Dateisystem (auf der Festplatte). Pedantisch aber wahr. :)
PaulRein
19

Linux- und * NIX-Systeme verwenden verschiedene Caches, die zwischen den Dateisystemen (abstrahiert durch VFS) und den Prozessen auf Benutzerebene liegen. Es ist also nicht grep und es ist nicht das Dateisystem, das das Caching durchführt - es ist das Betriebssystem.

Der Cache, der für Ihre grep-Leistung verantwortlich ist, ist der VFS-Puffercache. Andere Caches sind für Inodes und Verzeichnisse gedacht, aber diese würden hier nicht ins Spiel kommen.

Weitere Informationen finden Sie unter: Linux-Dokumentationsprojekt: 9.2 Das virtuelle Dateisystem http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
quelle
5
Wenn Sie ein rekursives Grep ausführen, machen sich die Inode- und Dentry-Caches bemerkbar. In einem Test /usr/includedauerte ein Grep innerhalb von ~ 16,4 Sekunden auf meinem System, wobei alle Caches gelöscht wurden. Mit allem, was zwischengespeichert ist, ca. 0,3 Sekunden. Wenn ich nur den Seiten-Cache lösche (der den Puffer-Cache enthält), dauert es ~ 14,3 Sekunden. Wenn ich den Seiten-Cache verlasse und die Dentry- / Inode-Caches lösche, sind es ungefähr 12 Sekunden.
Mattdm
@mattdm, das ist interessant. Wie hast du die Caches gelöscht?
JRW