Чи grep використовує кеш для прискорення пошуку?


36

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

Це говорить про те, що grep використовує якесь кешування структур, які використовуються для пошуку, але я не зміг знайти посилання в Інтернеті.

Який механізм дозволяє grepшвидше повертати результати при наступних пошуку?

Відповіді:


60

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


2
Я згоден. Перший раз, коли ви копіюєте файл, код файлової системи завантажує файл з диска в кеш; коли ви знову перекочуєте його, ще не встиг закінчитися з кешу. Перевірте, чи є спосіб вручну промити кеш файлової системи, а потім порівняйте до та після.
Шадур

3
@Shadur - є спосіб. Дивіться unix.stackexchange.com/questions/8398/…
mattdm

3
Практичної різниці немає, але це кеш ядра, а не файлова система.
pboin

@pboin Добре, я взяв невеликий ярлик. Звичайно, це частина ядра, яка обробляє файлову систему, яка робить кешування, а не файлову систему (на диску). Педантичний, але правдивий. :)
PaulRein

19

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

Кеш, який відповідає за вашу функцію grep, є VFS Buffer Cache. Інші кеші призначені для inode та каталогів, але вони тут не гратимуться.

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


5
Якщо ви робите рекурсивний греп, кеш-пам’ятка для зубів і зубних рядів помітно зміниться. У тесті, греп в межах /usr/includeзаймав ~ 16,4 секунди в моїй системі з усіма кешами. З кешем всього, приблизно 0,3 секунди. Якщо я скидаю лише кеш сторінки (в якому зберігається кеш-пам'ять), це займе ~ 14,3 секунди. Якщо я залишу кеш сторінки і скину кеш-пам'ять зубів / inode, це пройде приблизно 12 секунд.
mattdm

@mattdm, це цікаво. Як ви скинули схованки?
JRW


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.