- Công cụ tìm kiếm chuỗi siêu tốc được viết bằng C dành cho các ứng dụng coi trọng hiệu năng
- Tự động chọn thuật toán tối ưu một cách động tùy theo đặc tính của mẫu và phần cứng
- Tận dụng phần cứng như SSE4.2/AVX2 để cung cấp thông lượng tối đa
- Chia tệp thành các chunk để hỗ trợ dung lượng lớn và xử lý song song đa luồng
- Sử dụng thuật toán tìm kiếm phù hợp nhất tùy theo mẫu
- Boyer-Moore-Horspool: phù hợp cho khớp mẫu thông thường
- Thuật toán Knuth-Morris-Pratt (KMP): tối ưu cho mẫu ngắn
- Rabin-Karp: hiệu quả với mẫu dài
- Tăng tốc SIMD: cải thiện hiệu năng trên phần cứng hỗ trợ SSE4.2, AVX2
- Sử dụng memory-mapped file I/O để giảm thiểu system call và tối đa hóa thông lượng
- Tùy chọn tìm kiếm linh hoạt
- Tìm kiếm phân biệt chữ hoa chữ thường và không phân biệt
- Có thể tìm trực tiếp trong chuỗi ngoài việc tìm trong tệp
- Cung cấp chế độ chỉ in số lần khớp
Cách sử dụng
krep [OPTIONS] PATTERN [FILE]
- Tìm “error” trong tệp log:
krep "error" system.log
- Tìm kiếm không phân biệt hoa thường với 8 luồng:
krep -i -t 8 "ERROR" large_logfile.log
- In số lần khớp (không in các dòng đã khớp):
krep -c "TODO" *.c
- Tìm trực tiếp trong chuỗi thay vì trong tệp:
krep -s "Hello" "Hello world"
Tùy chọn dòng lệnh
- -i : tìm kiếm không phân biệt chữ hoa chữ thường
- -c : chỉ in số lần khớp mà không in các dòng đã khớp
- -t NUM : sử dụng NUM luồng (mặc định: 4)
- -s STRING : tìm trong chuỗi thay vì trong tệp
- -v : in thông tin phiên bản
- -h : in trợ giúp
Benchmark
- Hiệu năng của
krep vượt trội rõ rệt so với các công cụ tìm kiếm chuỗi thông dụng.
- krep mất 0,78 giây để tìm một mẫu thông thường trong tệp văn bản 1GB, tương đương tốc độ 1.282MB/giây
- grep mất 2,95 giây cho cùng tác vụ, đạt tốc độ 339MB/giây
- ripgrep mất 1,48 giây, đạt tốc độ 676MB/giây
- →
krep nhanh hơn grep khoảng 3,8 lần và nhanh hơn ripgrep khoảng 1,9 lần (hiệu năng có thể thay đổi tùy phần cứng và đặc tính tệp)
Nguồn gốc tên gọi
- “krep” bắt nguồn từ từ tiếng Iceland “kreppan”
- Có nghĩa là “chộp lấy thật nhanh”
- Tượng trưng cho khả năng nhận diện mẫu hiệu quả
- Là một lệnh ngắn gọn, súc tích và dễ gõ
2 bình luận
Nếu bỏ hỗ trợ biểu thức chính quy mà cũng chỉ nhanh hơn ripgrep khoảng 2 lần thì độ hữu dụng đúng là hơi thấp.
Có lẽ tôi sẽ cứ tiếp tục dùng ripgrep vì nó hỗ trợ biểu thức chính quy.
Ý kiến trên Hacker News
Tính năng CPU (ví dụ: AVX2) cần được phát hiện ở thời gian chạy
ifdefchỉ phát hiện ở thời điểm build liệu trình biên dịch có hỗ trợ hay khôngGiới thiệu bài đăng blog về dự án krep
madvise(), cần thêm'-D_GNU_SOURCE'vào CFLAGS của MakefileTầm quan trọng của test case
Kết quả benchmark sau khi khắc phục vấn đề build
Thử benchmark với tần suất khớp cao
Các lần thử benchmark bổ sung
Thuật toán của ripgrep và việc dùng memory map
Nghi vấn về kết quả benchmark
Ý kiến về tên gọi krep