Jadi saya pergi ke sumbernya, dan sepertinya kelambanan dalam menangani karakter byte ganda. Intinya, untuk setiap karakter yang dibaca, perlu memanggil mbrtowc()
untuk mencoba mengubahnya menjadi karakter lebar, maka karakter lebar itu diuji untuk melihat apakah itu pemisah kata, pemisah garis, dll.
Memang, jika saya mengubah LANG
variabel lokal saya dari default en_US.UTF-8
(UTF-8 adalah set karakter multibyte) dan mengaturnya ke " C
" (set karakter byte tunggal sederhana), wc
dapat menggunakan optimasi byte tunggal, yang mempercepatnya jauh, hanya membutuhkan sekitar seperempat selama sebelumnya.
Selain itu, ia hanya perlu memeriksa setiap karakter jika itu menghitung kata ( -w
), panjang baris ( -L
) atau karakter ( -m
). Jika hanya melakukan byte dan / atau jumlah baris, itu dapat melewati penanganan karakter lebar dan kemudian berjalan sangat cepat - lebih cepat dari md5sum
.
Aku berlari melalui gprof
, dan fungsi-fungsi yang digunakan untuk menangani karakter multibyte ( mymbsinit()
, mymbrtowc()
, myiswprint()
, dll) yang mengambil sekitar 30% dari waktu eksekusi saja, dan kode bahwa langkah-langkah melalui buffer jauh lebih kompleks karena harus menangani langkah-langkah berukuran variabel melalui buffer untuk karakter berukuran variabel, serta menjejalkan setiap karakter yang diselesaikan sebagian yang span buffer kembali ke awal buffer sehingga dapat ditangani di waktu berikutnya.
Sekarang saya tahu apa yang harus dicari, saya menemukan beberapa posting menyebutkan lambatnya utf-8 dengan beberapa utilitas:
/programming/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up
http://dtrace.org/blogs/brendan/2011/12/08 / 2000x-performance-win /