Có phải grep sử dụng bộ đệm để tăng tốc các tìm kiếm?


35

Tôi đã nhận thấy rằng các lần chạy tiếp theo của grepcùng một truy vấn (và cũng là một truy vấn khác, nhưng trên cùng một tệp) nhanh hơn nhiều so với lần chạy đầu tiên (hiệu ứng có thể dễ dàng nhận thấy khi tìm kiếm qua một tệp lớn).

Điều này cho thấy grep sử dụng một số loại bộ nhớ đệm của các cấu trúc được sử dụng để tìm kiếm, nhưng tôi không thể tìm thấy tài liệu tham khảo trên Internet.

Cơ chế nào cho phép greptrả về kết quả nhanh hơn trong các tìm kiếm tiếp theo?

Câu trả lời:


59

Không phải grep như vậy, nhưng bản thân hệ thống tập tin thường lưu trữ dữ liệu đọc gần đây, khiến các lần chạy sau chạy nhanh hơn vì grep đang tìm kiếm hiệu quả trong bộ nhớ thay vì đĩa.


2
Tôi đồng tình. Lần đầu tiên bạn grep một tệp, mã hệ thống tệp sẽ tải tệp từ đĩa vào bộ đệm; Khi bạn grep nó một lần nữa ngay sau đó, nó vẫn chưa có thời gian hết hạn từ bộ đệm. Xem có cách nào để xóa thủ công bộ đệm của hệ thống tập tin không, sau đó so sánh trước và sau lần.
Shadur

3
@Shadur - có một cách. Xem unix.stackexchange.com/questions/8398/ Mạnh
mattdm

3
Không có sự khác biệt thực tế, nhưng đó là bộ đệm kernel, không phải hệ thống tập tin.
pboin

@pboin Ok, mình lấy một phím tắt nhỏ. Tất nhiên, nó là một phần của kernel xử lý hệ thống tập tin thực hiện bộ nhớ đệm chứ không phải hệ thống tập tin (trên đĩa). Pedantic nhưng đúng. :)
PaulRein

19

Các hệ thống Linux và * NIX sử dụng các bộ đệm khác nhau nằm giữa các hệ thống tệp (được trừu tượng hóa thông qua VFS) và các quy trình ở cấp độ người dùng. Vì vậy, nó không phải là grep và nó không phải là hệ thống tập tin thực hiện bộ nhớ đệm - đó là hệ điều hành.

Bộ đệm chịu trách nhiệm cho hiệu suất grep của bạn là Bộ đệm Bộ đệm VFS. Các bộ nhớ cache khác dành cho inodes và thư mục nhưng chúng không được sử dụng ở đây.

Để biết thêm thông tin, hãy xem: Dự án Tài liệu Linux: 9.2 Hệ thống tệp ảo http://tldp.org/LDP/tlk/fs/filesystem.html


5
Nếu bạn đang thực hiện một grep đệ quy, bộ đệm inode và nha khoa tạo ra sự khác biệt đáng chú ý. Trong một thử nghiệm, một grep trong vòng /usr/includemất ~ 16,4 giây trên hệ thống của tôi với tất cả các bộ nhớ cache bị loại bỏ. Với tất cả mọi thứ được lưu trữ, khoảng 0,3 giây. Nếu tôi chỉ thả bộ đệm trang (giữ bộ đệm bộ đệm), sẽ mất ~ 14,3 giây. Nếu tôi rời khỏi bộ đệm trang và thả bộ đệm / inode, khoảng 12 giây.
mattdm

@mattdm, thật thú vị. Làm thế nào bạn thả bộ nhớ cache?
JRW


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.