¿Grep usa un caché para acelerar las búsquedas?

36

He notado que las ejecuciones posteriores de grepla misma consulta (y también una consulta diferente, pero en el mismo archivo) son mucho más rápidas que la primera ejecución (el efecto se nota fácilmente al buscar en un archivo grande).

Esto sugiere que grep utiliza algún tipo de almacenamiento en caché de las estructuras utilizadas para la búsqueda, pero no pude encontrar una referencia en Internet.

¿Qué mecanismo permite grepdevolver resultados más rápido en búsquedas posteriores?

Lazer
fuente

Respuestas:

60

No es grep como tal, pero el sistema de archivos en sí a menudo almacena en caché los datos leídos recientemente, lo que hace que las ejecuciones posteriores sean más rápidas ya que grep está buscando efectivamente en la memoria en lugar de en el disco.

PaulRein
fuente
2
Estoy de acuerdo. La primera vez que grep un archivo, el código del sistema de archivos carga el archivo del disco en el caché; cuando lo vuelves a usar poco después, aún no ha tenido tiempo de expirar del caché. Vea si hay una manera de vaciar manualmente el caché del sistema de archivos, luego compare antes y después de las horas.
Shadur
3
@Shadur: hay una manera. Ver unix.stackexchange.com/questions/8398/…
mattdm el
3
No hay una diferencia práctica, pero es un caché del núcleo, no el sistema de archivos.
pboin
@pboin Ok, tomé un pequeño atajo. Por supuesto, es la parte del núcleo que maneja el sistema de archivos lo que hace el almacenamiento en caché, no el sistema de archivos (en el disco) en sí mismo. Pedantic pero cierto. :)
PaulRein
19

Los sistemas Linux y * NIX hacen uso de varios cachés que se encuentran entre los sistemas de archivos (abstraídos a través de VFS) y los procesos a nivel de usuario. Entonces no es grep y no es el sistema de archivos el que hace el almacenamiento en caché, es el sistema operativo.

El caché que es responsable de su rendimiento grep es el caché de búfer VFS. Otros cachés son para inodes y directorios, pero esos no entrarían en juego aquí.

Para obtener más información, consulte: Proyecto de documentación de Linux: 9.2 El sistema de archivos virtual http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
fuente
55
Si está haciendo un grep recursivo, los cachés de inodo y dentry hacen una diferencia notable. En una prueba, un grep /usr/includetomó ~ 16.4 segundos en mi sistema con todas las memorias caché caídas. Con todo en caché, unos 0,3 segundos. Si elimino solo la memoria caché de la página (que contiene la memoria caché del búfer), tarda ~ 14.3 segundos. Si dejo la memoria caché de la página y dejo caer las memorias caché dentry / inode, son unos 12 segundos.
mattdm
@mattdm, eso es interesante. ¿Cómo se te cayeron los cachés?
JRW