Est-ce que grep utilise un cache pour accélérer les recherches?

36

J'ai remarqué que des passages ultérieurs de grep la même requête (et également d'une requête différente, mais du même fichier) sont beaucoup plus rapides que la première exécution (l'effet est facilement perceptible lors de la recherche dans un fichier volumineux).

Cela suggère que grep utilise une sorte de cache des structures utilisées pour la recherche, mais que je n'ai pas trouvé de référence sur Internet.

Quel mécanisme permet grepde renvoyer les résultats plus rapidement lors de recherches ultérieures?

Lazer
la source

Réponses:

60

Ce n'est pas grep en tant que tel, mais le système de fichiers lui-même met souvent en cache les données récemment lues, ce qui accélère les exécutions ultérieures, car grep effectue effectivement une recherche en mémoire plutôt qu'en disque.

PaulRein
la source
2
Je suis d'accord. La première fois que vous grepez un fichier, le code du système de fichiers charge le fichier à partir du disque dans le cache; lorsque vous le récupérez à nouveau peu de temps après, il n'a pas encore eu le temps d'expirer de la mémoire cache. Voyez s'il existe un moyen de vider manuellement le cache du système de fichiers, puis comparez les temps avant et après.
Shadur
3
@Shadur - il y a un moyen. Voir unix.stackexchange.com/questions/8398/…
mattdm
3
Il n'y a pas de différence pratique, mais c'est un cache de noyau, pas le système de fichiers.
pboin
@pboin Ok, j'ai pris un petit raccourci. Bien entendu, c’est la partie du noyau qui gère le système de fichiers qui ne met pas en cache le système de fichiers (sur le disque) en elle-même. Pédant mais vrai. :)
PaulRein
19

Les systèmes Linux et * NIX utilisent divers caches situés entre les systèmes de fichiers (résumés via VFS) et les processus de niveau utilisateur. Donc, ce n'est pas grep et ce n'est pas le système de fichiers qui fait la mise en cache, c'est le système d'exploitation.

Le cache qui est responsable de vos performances grep est le cache tampon VFS. D'autres caches sont destinés aux inodes et aux répertoires, mais ceux-ci n'entrent pas en ligne de compte.

Pour plus d'informations, voir: Projet de documentation Linux: 9.2 Le système de fichiers virtuel http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
la source
5
Si vous faites un grep récursif, les caches inode et dentry font une différence notable. Dans un test, un grep dans a /usr/includepris environ 16,4 secondes sur mon système avec tous les caches supprimés. Avec tout en cache, environ 0,3 seconde. Si je ne supprime que le cache de pages (qui contient le cache de tampons), cela prend environ 14,3 secondes. Si je quitte le cache des pages et lâche les caches dentry / inode, le temps est d'environ 12 secondes.
Mattdm
@mattdm, c'est intéressant. Comment as-tu laissé tomber les caches?
JRW