Untuk menambah jawaban Steve yang luar biasa.
Ini mungkin tidak dikenal secara luas tetapi grep hampir selalu lebih cepat saat grep untuk string pola yang lebih panjang daripada yang pendek, karena dalam pola yang lebih panjang, Boyer-Moore dapat melompat maju dalam langkah yang lebih lama untuk mencapai kecepatan sublinear yang lebih baik :
Contoh:
# 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
Bentuk yang lebih panjang 35% lebih cepat!
Bagaimana bisa? Boyer-Moore menyusun tabel lewati maju dari string pola, dan setiap kali ada ketidakcocokan, ia memilih lompatan terpanjang yang mungkin (dari karakter terakhir ke karakter pertama) sebelum membandingkan satu karakter di input ke karakter di tabel lewati.
Berikut adalah video yang menjelaskan Boyer Moore (Penghargaan untuk kommradHomer)
Kesalahpahaman umum lainnya (untuk GNU grep) fgrep
adalah lebih cepat dari grep
. f
in fgrep
tidak berarti 'cepat', itu singkatan dari 'tetap' (lihat halaman manual), dan karena keduanya adalah program yang sama, dan keduanya menggunakan Boyer-Moore , tidak ada perbedaan kecepatan di antara mereka saat mencari tetap- string tanpa karakter khusus regexp. Alasan saja aku digunakan fgrep
adalah ketika ada char khusus regexp (seperti .
, []
, atau *
) saya tidak ingin ditafsirkan seperti itu. Dan bahkan kemudian bentuk yang lebih portabel / standar grep -F
lebih disukai fgrep
.