- เครื่องมือค้นหาสตริงความเร็วสูงพิเศษที่เขียนด้วย C สำหรับแอปพลิเคชันที่ต้องการประสิทธิภาพสูง
- เลือกอัลกอริทึมที่เหมาะสมที่สุดแบบไดนามิกตามลักษณะของแพตเทิร์นและฮาร์ดแวร์
- ใช้ประโยชน์จากฮาร์ดแวร์อย่าง SSE4.2/AVX2 เพื่อมอบ throughput สูงสุด
- แบ่งไฟล์เป็นชังก์เพื่อรองรับข้อมูลขนาดใหญ่ และประมวลผลแบบขนานด้วยมัลติเธรด
- ใช้อัลกอริทึมการค้นหาที่เหมาะสมที่สุดตามแพตเทิร์น
- Boyer-Moore-Horspool: เหมาะกับการจับคู่แพตเทิร์นทั่วไป
- อัลกอริทึม Knuth-Morris-Pratt (KMP): ปรับให้เหมาะกับแพตเทิร์นสั้น
- Rabin-Karp: มีประสิทธิภาพกับแพตเทิร์นยาว
- การเร่งความเร็วด้วย SIMD: เพิ่มประสิทธิภาพบนฮาร์ดแวร์ที่รองรับ SSE4.2 และ AVX2
- ใช้memory-mapped file I/O เพื่อลด system call ให้เหลือน้อยที่สุดและเพิ่ม throughput สูงสุด
- ตัวเลือกการค้นหาที่ยืดหยุ่น
- ค้นหาแบบแยกหรือไม่แยกตัวพิมพ์เล็ก-ใหญ่
- ค้นหาในสตริงโดยตรงได้ นอกเหนือจากการค้นหาในไฟล์
- มีโหมดสำหรับแสดงเฉพาะจำนวนครั้งที่ตรงกัน
วิธีใช้งาน
krep [OPTIONS] PATTERN [FILE]
- ค้นหา “error” ในไฟล์ล็อก:
krep "error" system.log
- ค้นหาโดยไม่แยกตัวพิมพ์เล็ก-ใหญ่ พร้อมใช้ 8 เธรด:
krep -i -t 8 "ERROR" large_logfile.log
- แสดงจำนวนครั้งที่ตรงกัน (ไม่แสดงบรรทัดที่แมตช์):
krep -c "TODO" *.c
- ค้นหาโดยตรงจากสตริงแทนไฟล์:
krep -s "Hello" "Hello world"
ตัวเลือกบรรทัดคำสั่ง
- -i : ค้นหาแบบไม่แยกตัวพิมพ์เล็ก-ใหญ่
- -c : แสดงเฉพาะจำนวนครั้งที่ตรงกันโดยไม่พิมพ์บรรทัดที่แมตช์
- -t NUM : ใช้เธรดจำนวน NUM (ค่าเริ่มต้น: 4)
- -s STRING : ค้นหาในสตริงแทนไฟล์
- -v : แสดงข้อมูลเวอร์ชัน
- -h : แสดงวิธีใช้
เบนช์มาร์ก
- ประสิทธิภาพของ
krep โดดเด่นมากเมื่อเทียบกับเครื่องมือค้นหาสตริงทั่วไป
- krep ใช้เวลา 0.78 วินาที ในการค้นหาแพตเทิร์นทั่วไปในไฟล์ข้อความขนาด 1GB คิดเป็นความเร็ว 1,282MB ต่อวินาที
- grep ใช้เวลา 2.95 วินาที สำหรับงานเดียวกัน และทำความเร็วได้ 339MB ต่อวินาที
- ripgrep ใช้เวลา 1.48 วินาที และทำความเร็วได้ 676MB ต่อวินาที
- →
krep เร็วกว่า grep ประมาณ 3.8 เท่า และเร็วกว่า ripgrep ประมาณ 1.9 เท่า (ประสิทธิภาพอาจแตกต่างกันตามฮาร์ดแวร์และลักษณะของไฟล์)
ที่มาของชื่อ
- “krep” มาจากคำในภาษาไอซ์แลนด์ “kreppan”
- มีความหมายว่า “คว้าอย่างรวดเร็ว”
- สื่อถึงการจดจำแพตเทิร์นอย่างมีประสิทธิภาพ
- เป็นคำสั่งสั้น กระชับ และพิมพ์ได้ง่าย
2 ความคิดเห็น
ถ้าตัดการรองรับ regex ออกไปแล้ว แต่ยังเร็วกว่า ripgrep ได้แค่ 2 เท่า ก็ดูจะมีประโยชน์ใช้งานค่อนข้างน้อยนะครับ
ส่วนผมคงจะใช้ ripgrep ที่รองรับ regex ต่อไปเหมือนเดิมครับ
ความคิดเห็นจาก Hacker News
ฟีเจอร์ของ CPU (เช่น AVX2) ควรถูกตรวจจับตอนรันไทม์
ifdefตรวจจับได้แค่ว่าคอมไพเลอร์รองรับหรือไม่ในช่วงบิลด์ไทม์แนะนำบล็อกโพสต์เกี่ยวกับโปรเจ็กต์ krep
madvise(), ต้องเพิ่ม-D_GNU_SOURCEใน CFLAGS ของ Makefileความสำคัญของเคสทดสอบ
ผลเบนช์มาร์กหลังแก้ปัญหาการบิลด์
การลองเบนช์มาร์กที่มีความถี่การแมตช์สูง
การลองเบนช์มาร์กเพิ่มเติม
อัลกอริทึมของ ripgrep และการใช้ memory map
ข้อสงสัยเกี่ยวกับผลเบนช์มาร์ก
ความเห็นเกี่ยวกับชื่อ krep