कैसे ... तथ्य यह है कि प्रिंटफ स्वयं लिखता है, क्या यह संभव है? क्या ऐसा कुछ है जो मुझे याद आ रहा है?
हां, ऐसा कुछ है जिसे आप याद कर रहे हैं। printf
आवश्यक नहीं है write
हर बार पर कॉल करें। इसके बजाय, printf
इसके आउटपुट को बफर करता है। यही है, यह अक्सर मेमोरी बफर में अपना परिणाम संग्रहीत करता है, केवल बफर भरने पर, या कुछ अन्य स्थितियों पर write
पर कॉल करता है।
write
एक काफी महंगा कॉल, बहुत printf
के बफर में डेटा की प्रतिलिपि है, तो write
कॉल की संख्या एक शुद्ध प्रदर्शन जीत को कम करने प्रदान करता है से ज्यादा महंगा है।
अपने stdout एक टर्मिनल डिवाइस को निर्देश दिया जाता है, तो printf
कॉल write
हर बार यह एक \n
देखता है - आपके मामले में, हर बार यह कहा जाता है। यदि आपका स्टडआउट किसी फ़ाइल (या /dev/null
) पर निर्देशित किया गया है, तो printf
कॉल केवल तब लिखते हैं जब उसका आंतरिक बफर भरा होता है।
जाना चाहिए कि आप अपने उत्पादन रीडायरेक्ट कर रहे हैं, और कहा कि printf
के आंतरिक बफर 4Kbytes है, तो पहले पाश का आह्वान write
3000000/(4096/12) == 8780 बार। आपका दूसरा पाश, हालांकि, write
3000000 बार आमंत्रित करता है।
कम कॉल के प्रभाव से परे write
को, आकार write
के लिए कॉल के है। हार्ड ड्राइव में भंडारण की मात्रा एक क्षेत्र है - अक्सर 512 बाइट्स। किसी क्षेत्र की तुलना में डेटा की एक छोटी राशि लिखने के लिए इस क्षेत्र में मूल डेटा पढ़ने, इसे संशोधित करने और परिणाम को वापस लिखने में शामिल हो सकता है। एक पूर्ण क्षेत्र के साथ write
को आमंत्रित करना, हालांकि, मूल डेटा में पढ़ने की आवश्यकता नहीं होने के बाद से तेज़ी से बढ़ सकता है। printf
के बफर आकार को सामान्य क्षेत्र के आकार के एकाधिक होने के लिए चुना जाता है। इस तरह से सिस्टम डिस्क पर डेटा को सबसे कुशलता से लिख सकता है।
मुझे उम्मीद है कि आपका पहला पाश दूसरे की तुलना में बहुत तेज हो जाएगा।
स्रोत
2012-06-26 18:34:37
यह आपके सिस्टम पर निर्भर करता है – JMBise
printf बफरिंग करता है। –
वास्तव में? आप हर बार स्ट्रिंग लम्बाई की गणना कर रहे हैं और फिर उस समय के हिस्से के रूप में माप रहे हैं? –