Apakah grep menggunakan cache untuk mempercepat pencarian?

36

Saya telah memperhatikan bahwa menjalankan berikutnya greppada permintaan yang sama (dan juga permintaan yang berbeda, tetapi pada file yang sama) jauh lebih cepat daripada yang pertama dijalankan (efeknya mudah terlihat ketika mencari melalui file besar).

Ini menunjukkan bahwa grep menggunakan semacam caching dari struktur yang digunakan untuk pencarian, tetapi saya tidak dapat menemukan referensi di Internet.

Mekanisme apa yang memungkinkan grepuntuk mengembalikan hasil lebih cepat dalam pencarian berikutnya?

Lazer
sumber

Jawaban:

60

Tidak grep seperti itu, tetapi filesystem itu sendiri sering menyimpan cache baru-baru ini membaca data, menyebabkan kemudian berjalan lebih cepat karena grep secara efektif mencari dalam memori daripada disk.

PaulRein
sumber
2
Saya setuju. Pertama kali Anda grep file, kode sistem file memuat file dari disk ke cache; ketika Anda menerima lagi sesaat setelahnya, ia belum punya waktu untuk berakhir dari cache. Lihat apakah ada cara untuk membersihkan cache sistem file secara manual, lalu bandingkan sebelum dan sesudah waktu.
Shadur
3
@ Safur - ada cara. Lihat unix.stackexchange.com/questions/8398/…
mattdm
3
Tidak ada perbedaan praktis, tetapi itu adalah cache kernel, bukan sistem file.
pboin
@oin Ok, saya mengambil jalan pintas kecil. Tentu saja itu adalah bagian dari kernel yang menangani sistem file yang melakukan caching bukan pada sistem file (pada disk) itu sendiri. Pedantik tetapi benar. :)
PaulRein
19

Sistem Linux dan * NIX menggunakan berbagai cache yang berada di antara sistem file (disarikan melalui VFS) dan proses tingkat pengguna. Jadi ini bukan grep dan bukan filesystem yang melakukan caching - ini adalah sistem operasinya.

Cache yang bertanggung jawab atas kinerja grep Anda adalah Cache Buffer VFS. Tembolok lain adalah untuk inode dan direktori tetapi itu tidak akan berlaku di sini.

Untuk info lebih lanjut, lihat: Proyek Dokumentasi Linux: 9.2 Sistem File Virtual http://tldp.org/LDP/tlk/fs/filesystem.html

JRW
sumber
5
Jika Anda melakukan grep rekursif, cache inode dan dentry membuat perbedaan yang nyata. Dalam sebuah pengujian, grep dalam /usr/includewaktu ~ 16,4 detik pada sistem saya dengan semua cache dijatuhkan. Dengan segala yang di-cache, sekitar 0,3 detik. Jika saya menjatuhkan hanya halaman cache (yang menyimpan cache buffer), dibutuhkan ~ 14,3 detik. Jika saya meninggalkan halaman cache dan menjatuhkan cache dentry / inode, itu sekitar 12 detik.
mattdm
@mattdm, itu menarik. Bagaimana Anda menjatuhkan cache?
JRW