Saya sangat kagum dengan fungsi GREP di shell, sebelumnya saya menggunakan metode substring di java tapi sekarang saya menggunakan GREP untuk itu dan dijalankan dalam hitungan detik, itu lebih cepat dari kode java yang biasa saya tulis. (menurut pengalaman saya, saya mungkin salah)
Yang sedang berkata saya belum bisa mengetahui bagaimana itu terjadi? juga tidak banyak tersedia di web.
Adakah yang bisa membantu saya dengan ini?
Jawaban:
Dengan asumsi pertanyaan Anda berhubungan
GNU grep
secara khusus. Berikut catatan dari penulis, Mike Haertel:Jawaban ini adalah bagian dari informasi yang diambil dari sini .
sumber
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:
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 darigrep
.f
infgrep
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 digunakanfgrep
adalah ketika ada char khusus regexp (seperti.
,[]
, atau*
) saya tidak ingin ditafsirkan seperti itu. Dan bahkan kemudian bentuk yang lebih portabel / standargrep -F
lebih disukaifgrep
.sumber
xs.txt
berisi 100000000 'x, dan Anda melakukannyagrep yx xs.txt
, maka sebenarnya gagal untuk menemukan kecocokan lebih cepat daripada jika Anda melakukannyagrep yxxxxxxxxxxxxxxxxxxx xs.txt
. Peningkatan Boyer-Moore-Horspool menjadi Boyer-Moore meningkatkan lompatan ke depan dalam kasus itu, tetapi mungkin tidak hanya tiga instruksi mesin dalam kasus umum.grep/fgrep/egrep
menjadi semua hardlink ke executable yang sama telah berlalu. Mereka (dan ekstensi lain sepertiz*grep
bz*grep
utilitas yang mendekompresi dengan cepat), sekarang menjadi pembungkus cangkang kecilgrep
. Beberapa komentar historis yang menarik tentang peralihan antara satu executable & pembungkus shell dapat ditemukan di komit ini: git.savannah.gnu.org/cgit/grep.git/commit/…