इसलिए मैं स्रोत पर गया, और ऐसा लग रहा है कि सुस्ती डबल बाइट पात्रों को संभालने में है। अनिवार्य रूप से, प्रत्येक वर्ण को पढ़ने के लिए, उसे mbrtowc()
एक विस्तृत वर्ण में बदलने के लिए प्रयास करने के लिए कॉल करने की आवश्यकता होती है, फिर उस विस्तृत चरित्र को देखने के लिए परीक्षण किया जाता है कि क्या यह एक शब्द विभाजक, लाइन विभाजक, आदि है।
दरअसल, अगर मैं अपने लोकल LANG
वेरिएबल को डिफॉल्ट से बदल देता हूं en_US.UTF-8
(UTF-8 एक मल्टीबाइट कैरेक्टर सेट है) और इसे " C
" (सिंपल सिंगल बाइट कैरेक्टर सेट) पर सेट करता है, wc
सिंगल-बाइट ऑप्टिमाइज़ेशन का उपयोग करने में सक्षम है, जो इसे काफी तेजी से गति देता है। पहले की तुलना में केवल एक चौथाई ही लेना।
इसके अतिरिक्त, इसे केवल प्रत्येक वर्ण को जांचना होगा यदि यह शब्द ( -w
), पंक्ति की लंबाई ( -L
) या वर्ण ( -m
) की गणना करता है। यदि यह केवल बाइट और / या लाइन काउंट कर रहा है, तो यह वाइड कैरेक्टर हैंडलिंग को छोड़ सकता है और फिर यह बहुत तेज़ी से - से तेज़ चलता है md5sum
।
मैं इसे से होकर गुजरता था gprof
, और कार्यों कि multibyte वर्ण (को संभालने के लिए उपयोग किया जाता है mymbsinit()
, mymbrtowc()
, myiswprint()
, आदि) निष्पादन समय अकेले का 30%, और कोड के बारे में ले रहे हैं कि बफर से तीसरे चरण का और अधिक जटिल है क्योंकि यह करने के लिए किया है चर आकार वर्णों के लिए बफर के माध्यम से चर आकार के चरणों को संभालें, साथ ही साथ आंशिक रूप से पूर्ण किए गए वर्णों को भराई करें जो बफर को बफर की शुरुआत में वापस फैलाते हैं ताकि अगली बार इसे संभाला जा सके।
अब जब मुझे पता है कि मुझे क्या देखना है, तो मुझे कुछ उपयोगिताओं के साथ utf-8 मंदी का उल्लेख करते हुए कुछ पोस्ट मिले:
/programming/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up
http://dtrace.org/blogs/brendan/2011/12/08 / 2000x प्रदर्शन-जीत /