O grep usa um cache para acelerar as pesquisas?

36

Percebi que execuções subsequentes grepna mesma consulta (e também em uma consulta diferente, mas no mesmo arquivo) são muito mais rápidas que a primeira execução (o efeito é facilmente perceptível ao pesquisar em um arquivo grande).

Isso sugere que o grep usa algum tipo de cache das estruturas usadas para pesquisa, mas não consegui encontrar uma referência na Internet.

Qual mecanismo permite grepretornar resultados mais rapidamente nas pesquisas subseqüentes?

lazer
fonte

Respostas:

60

Não o grep, como tal, mas o próprio sistema de arquivos geralmente armazena em cache os dados lidos recentemente, fazendo com que as execuções posteriores sejam mais rápidas, pois o grep está efetivamente pesquisando na memória em vez de no disco.

PaulRein
fonte
2
Eu concordo. Na primeira vez que você grep um arquivo, o código do sistema de arquivos carrega o arquivo do disco no cache; quando você o recebe novamente logo depois, ainda não teve tempo de expirar do cache. Veja se há uma maneira de liberar manualmente o cache do sistema de arquivos e compare os horários antes e depois.
Shadur 9/03/11
3
@ Shadur - existe um caminho. Veja unix.stackexchange.com/questions/8398/…
mattdm
3
Não há diferença prática, mas é um cache do kernel, não o sistema de arquivos.
22411 pboin
@ pboin Ok, tomei um pequeno atalho. Obviamente, é a parte do kernel que lida com o sistema de arquivos que faz o cache e não o sistema de arquivos (no disco) em si. Pedante, mas verdadeiro. :)
PaulRein
19

Os sistemas Linux e * NIX utilizam vários caches que ficam entre os sistemas de arquivos (abstraídos através do VFS) e os processos no nível do usuário. Portanto, não é grep e não é o sistema de arquivos que faz o cache - é o sistema operacional.

O cache responsável pelo seu desempenho grep é o cache de buffer do VFS. Outros caches são para inodes e diretórios, mas eles não entrariam em jogo aqui.

Para obter mais informações, consulte: Projeto de documentação do Linux: 9.2 O sistema de arquivos virtual http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
fonte
5
Se você estiver fazendo um grep recursivo, os caches de inode e dentry fazem uma diferença notável. Em um teste, um grep /usr/includelevou ~ 16,4 segundos no meu sistema com todos os caches descartados. Com tudo em cache, cerca de 0,3 segundos. Se eu soltar apenas o cache da página (que contém o cache do buffer), leva ~ 14,3 segundos. Se eu deixar o cache da página e soltar os caches de dentry / inode, são cerca de 12 segundos.
mattdm
@mattdm, isso é interessante. Como você eliminou os caches?
JRW