c - अगर मैं आउटपुट को/dev/null में रीडायरेक्ट करता हूं तो क्या प्रिंटफ की लागत अभी भी होगी?




linux performance (4)

हमारे पास एक डेमॉन है जिसमें बहुत सारे प्रिंट संदेश हैं। चूंकि हम एक कमजोर सीपीयू और अन्य बाधा हार्डवेयर के साथ एक एम्बेडेड डिवाइस पर काम कर रहे हैं, हम अपने अंतिम संस्करण में प्रिंटफ संदेशों के किसी भी प्रकार की लागत (आईओ, सीपीयू, आदि) को कम करना चाहते हैं। (उपयोगकर्ताओं के पास कंसोल नहीं है)

मेरी टीम के साथी और मेरी असहमति है। वह सोचता है कि हम हर चीज को / dev / null में रीडायरेक्ट कर सकते हैं। यह किसी भी IO का खर्च नहीं उठाएगा ताकि स्नेह कम से कम हो। लेकिन मुझे लगता है कि यह अभी भी सीपीयू खर्च करेगा और हम बेहतर प्रिंट के लिए एक मैक्रो को परिभाषित करते हैं ताकि हम "प्रिंटफ" (शायद सिर्फ वापसी) को फिर से लिख सकें।

इसलिए मुझे इस बारे में कुछ राय चाहिए कि कौन सही है। क्या लिनक्स प्रिंटफ को अनुकूलित करने के लिए पर्याप्त स्मार्ट होगा? मुझे वास्तव में संदेह है।


आम तौर पर बोलते हुए, कार्यान्वयन को ऐसे अनुकूलन करने की अनुमति दी जाती है यदि वे कार्यक्रम के अवलोकनीय (कार्यात्मक) आउटपुट को प्रभावित नहीं करते हैं। printf() के मामले में, इसका मतलब यह होगा कि यदि प्रोग्राम रिटर्न वैल्यू का उपयोग नहीं करता है, और यदि %n रूपांतरण नहीं हैं, तो कार्यान्वयन को कुछ भी नहीं करने दिया जाएगा।

व्यवहार में, मुझे लिनक्स पर किसी भी कार्यान्वयन के बारे में पता नहीं है जो वर्तमान में (2019 की शुरुआत में) इस तरह का अनुकूलन करता है - मैं जिस कंपाइलर और लाइब्रेरी से परिचित हूँ वह आउटपुट को प्रारूपित करेगा और कर्नेल पर भरोसा करते हुए, अशक्त डिवाइस को परिणाम लिखेगा। 'इसे अनदेखा करना।

यदि आप वास्तव में स्वरूपण की लागत को सहेजने की आवश्यकता नहीं है, जब उत्पादन का उपयोग नहीं किया जाता है - आप इसे वापस करने की आवश्यकता को लिख सकते हैं, तो आप void को वापस करने के लिए इसे तैयार करना चाहेंगे, और आपको %n लिए प्रारूप स्ट्रिंग की जांच करनी चाहिए। (यदि आप उन साइड-इफेक्ट्स की जरूरत है, तो आप NULL और 0 बफ़र के साथ snprintf उपयोग कर सकते हैं, लेकिन बचत किए गए प्रयास को चुकाने की संभावना नहीं है)।


एक दिशानिर्देश के रूप में प्रिंटफ () स्रोत का उपयोग करके प्रिंटफ (रैप्स) को लपेटें और यदि कोई नॉप्रिंट फ्लैग सेट है तो तुरंत वापस लौटें। इसका नकारात्मक पक्ष यह है कि वास्तव में छपाई करते समय प्रारूप स्ट्रिंग को दो बार पार्स करने के कारण यह अधिक संसाधनों का उपभोग करेगा। लेकिन मुद्रण न होने पर यह नगण्य संसाधनों का उपयोग करता है। बस प्रिंटफ () को प्रतिस्थापित नहीं कर सकते क्योंकि प्रिंटफ () के अंदर अंतर्निहित कॉल स्टैडियो लाइब्रेरी के नए संस्करण के साथ बदल सकते हैं।

void printf2 (कास्ट चार * फॉर्मस्ट्रिंग, ...);


printf फ़ंक्शन stdout को लिखता है। यदि stdout से जुड़ी फ़ाइल डिस्क्रिप्टर को /dev/null पुनर्निर्देशित किया जाता है, तो कोई भी आउटपुट कहीं भी नहीं लिखा जाएगा (लेकिन यह अभी भी लिखा जाएगा), लेकिन printf करने के लिए कॉल और इसे करने वाला स्वरूपण अभी भी होगा।


printf फ़ंक्शन stdout को लिखेगा। यह /dev/null लिए अनुकूलित करने के लिए अनुरूप नहीं है। इसलिए, आपके पास प्रारूप स्ट्रिंग को पार्स करने और किसी भी आवश्यक तर्क का मूल्यांकन करने का ओवरहेड होगा, और आपके पास कम से कम एक syscall होगा, साथ ही आप एक बफर को कर्नेल एड्रेस स्पेस में कॉपी करेंगे (जो कि sccall की लागत की तुलना में लापरवाह है) ।

यह उत्तर POSIX के विशिष्ट दस्तावेज पर आधारित है।

सिस्टम इंटरफेस
dprintf, fprintf, printf, snprintf, sprintf - प्रिंट स्वरूपित आउटपुट

Fprintf () फ़ंक्शन आउटपुट को नामित आउटपुट स्ट्रीम पर रखेगा। प्रिंटफ () फ़ंक्शन आउटपुट को मानक आउटपुट स्ट्रीम स्टडआउट पर रखेगा। स्प्रिंटफ () फ़ंक्शन आउटपुट को उसके बाद नल बाइट, '\ 0' के बाद, लगातार बाइट्स में * s पर शुरू करेगा; यह सुनिश्चित करने के लिए उपयोगकर्ता की ज़िम्मेदारी है कि पर्याप्त स्थान उपलब्ध हो।

आधार परिभाषाएँ
करेगा
एक कार्यान्वयन के लिए जो POSIX.1-2017 के अनुरूप है, एक विशेषता या व्यवहार का वर्णन करता है जो अनिवार्य है। एक एप्लिकेशन सुविधा या व्यवहार के अस्तित्व पर भरोसा कर सकता है।







dev-null