Pertama, nitpick: string seperti a*
pada sintaksis shell normal adalah gumpalan, yang bekerja secara berbeda dari ekspresi reguler.
Pada ikhtisar tingkat tinggi, shell interpreter (yaitu bash) memperluas string a*
ke daftar setiap nama file yang cocok dengan pola a*
. Ini kemudian menjadi bagian dari parameter baris perintah ke satu instance grep
(untuk programmer, semua kata yang diperluas pergi sebagai string terpisah ke dalam argv
argumen main
). grep
Perintah tunggal itu kemudian mem-parsing argumen dengan cara apa pun yang dipilihnya, dan terserah untuk grep
menafsirkan argumen tersebut sebagai nama file, opsi, argumen opsi, ekspresi reguler, dll., Dan mengambil tindakan yang sesuai. Semuanya terjadi secara berurutan (AFAIK tidak ada grep
implementasi menggunakan beberapa utas).
Jika Anda menerapkan loop dalam skrip shell untuk melakukan hal yang sama, itu hampir pasti lebih lambat dari proses di atas, karena alasan berikut. Jika Anda menelurkan proses grep baru untuk setiap file, itu pasti akan lebih lambat karena overhead pembuatan proses dikalikan tidak perlu. Jika Anda membuat daftar argumen sendiri di skrip shell dan menggunakan satu contoh grep
, apa pun yang Anda lakukan di shell masih akan lebih lambat karena perintah shell harus ditafsirkan (dengan bash), yang menambahkan lapisan kode tambahan, dan Anda akan hanya akan mengimplementasikan kembali apa yang sudah dilakukan bash lebih cepat secara internal dalam kode yang dikompilasi.
Sedangkan untuk menuliskannya sendiri dalam C, Anda mungkin dapat dengan mudah mendapatkan kinerja yang sebanding dengan proses yang dijelaskan dalam paragraf pertama, tetapi tidak mungkin Anda akan dapat mencapai cukup dari peningkatan kinerja dibandingkan implementasi grep / bash saat ini untuk membenarkan waktu. dihabiskan tanpa mempelajari optimalisasi kinerja khusus mesin atau mengorbankan portabilitas. Mungkin Anda bisa mencoba membuat versi yang dapat diparalelkan secara sewenang-wenang grep
, tetapi bahkan itu mungkin tidak membantu karena Anda lebih cenderung terikat I / O daripada terikat CPU. Ekspansi dan grep global sudah "cukup cepat" untuk sebagian besar tujuan "normal".
glob
bukan ekspresi reguler. Perbedaan besar.