Использует ли grep кеш для ускорения поиска?

36

Я заметил, что последующие прогоны одного и grepтого же запроса (а также другого запроса, но в том же файле) выполняются намного быстрее, чем первый прогон (эффект легко заметен при поиске в большом файле).

Это говорит о том, что grep использует какое-то кэширование структур, используемых для поиска, но я не смог найти ссылку в Интернете.

Какой механизм позволяет grepбыстрее возвращать результаты при последующих поисках?

Lazer
источник

Ответы:

60

Не grep как таковой, но сама файловая система часто кэширует недавно прочитанные данные, в результате чего последующие прогоны выполняются быстрее, поскольку grep эффективно выполняет поиск в памяти, а не на диске.

PaulRein
источник
2
Я согласен. При первом запуске grep файла код файловой системы загружает файл с диска в кэш; когда вы снова выполняете grep, у него еще не было времени истечения срока действия из кэша. Посмотрите, есть ли способ вручную очистить кеш файловой системы, а затем сравнить время до и после.
Шадур
3
@ Шадур - есть способ. См. Unix.stackexchange.com/questions/8398/…
mattdm
3
Практической разницы нет, но это кеш ядра, а не файловая система.
pboin
@pboin Хорошо, я взял небольшой ярлык. Конечно, именно часть ядра, которая обрабатывает файловую систему, выполняет кеширование, а не файловую систему (на диске). Педантично, но верно. :)
PaulRein
19

Системы Linux и * NIX используют различные кэши, которые находятся между файловыми системами (абстрагированными через VFS) и процессами пользовательского уровня. Так что это не grep и не файловая система, выполняющая кеширование - это операционная система.

Кеш, который отвечает за вашу производительность grep, является VFS Buffer Cache. Другие кеши предназначены для инодов и каталогов, но они не будут здесь использоваться.

Для получения дополнительной информации см .: Проект документации Linux: 9.2 Виртуальная файловая система http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
источник
5
Если вы выполняете рекурсивный grep, кэши inode и dentry вносят заметные изменения. В тесте grep в /usr/includeмоей системе занял ~ 16,4 секунды, все кэши были сброшены. Со всем кешируется около 0,3 секунды. Если я отбрасываю только кеш страницы (который содержит кеш буфера), это займет ~ 14,3 секунды. Если я покидаю кеш страниц и удаляю кеш дентри / инода, это занимает около 12 секунд.
Mattdm
@mattdm, это интересно. Как ты уронил тайники?
JRW