Bu yüzden kaynağa gittim ve yavaşlık çift baytlık karakterleri ele alıyor gibi görünüyor. Temel olarak, okunan her karakter için, onu mbrtowc()
geniş bir karaktere dönüştürmeyi denemek için çağırması gerekir, daha sonra bu geniş karakter, bir kelime ayırıcı, satır ayırıcı vb.
Aslında, yerel LANG
değişkenimi varsayılandan değiştiririm en_US.UTF-8
(UTF-8 çok baytlı bir karakter kümesidir) ve bunu " C
" (basit tek baytlı karakter kümesi) olarak ayarlarsam, wc
önemli ölçüde hızlandıran tek baytlı optimizasyonları kullanabilir, eskisi kadar sadece dörtte biri alıyor.
Ayrıca, her karakteri yalnızca word ( -w
), satır uzunluğu ( -L
) veya character ( -m
) sayıyorsa kontrol etmesi gerekir . Yalnızca bayt ve / veya satır sayıları yapıyorsa, geniş karakter işlemeyi atlayabilir ve daha sonra son derece hızlı çalışır - daha hızlıdır md5sum
.
Koştum gprof
ve baytlı karakterleri (işlemek için kullanılan işlevler mymbsinit()
, mymbrtowc()
, myiswprint()
, vs) tampon aracılığıyla adımlar çok daha karmaşık o zorunda olduğu için olduğunu 30 tek başına yürütme zamanının% ve kod hakkında kadar alıyor değişken boyutlu karakterler için arabellek boyunca değişken boyutlu adımları ele almanın yanı sıra, bir sonraki sefer ele alınabilmesi için arabelleği arabellek başına geçiren kısmen tamamlanmış karakterleri doldurma.
Şimdi ne arayacağımı bildiğime göre, bazı yardımcı programlarla utf-8 yavaşlığından bahseden birkaç gönderi buldum:
/programming/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up
http://dtrace.org/blogs/brendan/2011/12/08 / 2000x performanslı-kazan /