एक ही प्रोग्राम प्रदान करने के बाद जो यादृच्छिक जेनरेट की गई इनपुट फ़ाइल पढ़ता है और उसी स्ट्रिंग को इको करता है जो इसे आउटपुट में पढ़ता है। केवल अंतर यह है कि एक तरफ मैं लिनक्स सिस्को से पढ़ने और लिखने के तरीकों को प्रदान कर रहा हूं, और दूसरी तरफ मैं फ्रेड/फेराइट का उपयोग कर रहा हूं।क्यों fwrite libc फ़ंक्शन syscall लेखन फ़ंक्शन से तेज़ है?
आकार में 10 एमबी के इनपुट के साथ मेरे आवेदन को समयबद्ध करना और इसे/dev/null पर प्रतिबिंबित करना, और यह सुनिश्चित करना कि फ़ाइल कैश नहीं है, मुझे पता चला है कि बहुत छोटे बफर का उपयोग करते समय libc की fwrite एक बड़े पैमाने पर तेज़ है (मामले में 1 बाइट)।
यहाँ, समय पर अपने उत्पादन है fwrite का उपयोग कर:
real 0m0.948s
user 0m0.780s
sys 0m0.012s
और syscall लिखने का उपयोग कर:
real 0m8.607s
user 0m0.972s
sys 0m7.624s
केवल संभावना है कि मैं के बारे में सोच सकता है कि आंतरिक रूप से libc पहले से ही बफरिंग है मेरी इनपुट ... दुर्भाग्य से मुझे वेब के चारों ओर इतनी सारी जानकारी नहीं मिल सका, तो यहां गुरु यहां मेरी मदद कर सकते हैं।
"आंतरिक रूप से libc पहले से ही मेरे इनपुट को बफर कर रहा है"। यह वही है जो यह कर रहा है। यदि आप चाहें तो शायद आप libc के लिए स्रोत कोड भी पढ़ सकते हैं, और देख सकते हैं कि यह वास्तव में कैसा चल रहा है। – kquinn