เพื่อเพิ่มคำตอบที่ยอดเยี่ยมของสตีฟ
อาจไม่เป็นที่รู้จักในวงกว้าง แต่ grep มักจะเร็วกว่าเมื่อgrep สำหรับสตริงรูปแบบที่ยาวกว่าแบบสั้นเพราะในรูปแบบที่ยาวกว่าBoyer-Mooreสามารถข้ามไปข้างหน้าได้ในระยะที่ยาวขึ้นเพื่อให้ได้ความเร็วในแนวเส้นใต้ที่ดียิ่งขึ้น:
ตัวอย่าง:
# after running these twice to ensure apples-to-apples comparison
# (everything is in the buffer cache)
$ time grep -c 'tg=f_c' 20140910.log
28
0.168u 0.068s 0:00.26
$ time grep -c ' /cc/merchant.json tg=f_c' 20140910.log
28
0.100u 0.056s 0:00.17
แบบยาวเร็วขึ้น 35%!
มาได้ยังไง? Boyer-Mooreรวบรวมตารางการข้ามไปข้างหน้าจากสตริงรูปแบบและเมื่อใดก็ตามที่ไม่ตรงกันระบบจะเลือกการข้ามที่ยาวที่สุดเท่าที่จะเป็นไปได้ (จากอักขระสุดท้ายไปยังตัวแรก) ก่อนที่จะเปรียบเทียบอักขระเดียวในอินพุตกับอักขระในตารางข้าม
นี่คือวิดีโออธิบาย Boyer Moore (ให้เครดิตกับ kommradHomer)
ความเข้าใจผิดทั่วไปอีกประการหนึ่ง (สำหรับ GNU grep) fgrep
คือเร็วกว่าgrep
ไฟล์. f
in fgrep
ไม่ได้หมายถึง 'fast' ย่อมาจาก 'fixed' (ดู man page) และเนื่องจากทั้งสองเป็นโปรแกรมเดียวกันและทั้งคู่ใช้Boyer-Mooreจึงไม่มีความแตกต่างในความเร็วระหว่างการค้นหาคงที่ - สตริงที่ไม่มีอักขระพิเศษ regexp เพียงใช้ฉันเหตุผลfgrep
คือเมื่อมีถ่าน regexp พิเศษ (เช่น.
, []
หรือ*
) ผมไม่อยากให้มันถูกตีความว่าเป็นเช่นนั้น และแม้แล้วแบบพกพามากขึ้นรูปแบบ / มาตรฐานเป็นที่ต้องการมากกว่าgrep -F
fgrep