क्या रिलीज बिल्ड में आउटपुटडिबगस्ट्रिंग को कॉल करने के साथ जुड़े एक महत्वपूर्ण ओवरहेड है?रिलीज में आउटपुटडिबगस्ट्रिंग से जुड़े ओवरहेड
उत्तर
माप - 10 एम कॉल लगभग 50 सेकंड लेते हैं। मुझे लगता है कि यह अप्रयुक्त कार्यक्षमता के लिए महत्वपूर्ण ओवरहेड है।
एक मैक्रो का उपयोग करने से रिहाई निर्माण में इस से छुटकारा पाने:
#ifdef _DEBUG
#define LOGMESSAGE(str) OutputDebugString(str);
#else
#define LOGMESSAGE(str)
#endif
इतना ही नहीं कॉल निकाल देता है, लेकिन यह भी मानकों के मूल्यांकन और पाठ स्ट्रिंग्स पूरी तरह से हटा दिया और उन्हें सुलझाने में नहीं देखेंगे द्विआधारी फ़ाइल।
इसे स्वयं क्यों मापें? निम्न कोड संकलित करें, इसे & चलाएं। फिर आउटपुटडिबगस्ट्रिंग को कॉल हटाएं, पुनः संकलित करें और पुन: चालू करें। आपके समय के तीन मिनट का समय लेना चाहिए।
#include <windows.h>
int main() {
const int COUNT = 1000000;
int z = 0;
for (unsigned int i = 0; i < COUNT; i++) {
z += i;
OutputDebugString("foo");
}
return z;
}
मैं जो सभी के बिल्ट-इन मेट्रिक्स है, पिछले कुछ वर्षों में सर्वर साइड रिलीज़ मोड क्षुधा के दर्जनों में एक समस्या नहीं देखा है। आप इंप्रेशन प्राप्त कर सकते हैं कि यह धीमा है क्योंकि अधिकांश डिबग-कैचर अनुप्रयोग जो आप पा सकते हैं (DBWIN32 et al) स्क्रीन पर डेटा को फेंकने में बहुत धीमी हैं, जो अंतराल की छाप देता है।
बेशक हमारे अनुप्रयोगों के सभी इस उत्पादन डिफ़ॉल्ट रूप से अक्षम है, लेकिन यह , क्षेत्र में इसे चालू करने के बाद आप तो कई अनुप्रयोगों, DBWin32 की तरह कुछ में धारावाहिक से डिबग आउटपुट देख सकते हैं सक्षम होने के लिए उपयोगी है । यह बग्स के लिए एक बहुत उपयोगी डीबगिंग तकनीक हो सकती है जिसमें अनुप्रयोगों को संचारित करना शामिल है।
+1 _is उपयोगी है जो इसे field_ में चालू करने में सक्षम है –
मैं एक लेख है कि आंतरिक रूप से कुछ दिलचस्प बातें OutPutDebugString करता है में पढ़ा था:
- बनाता है \ म्युटेक्स खोलता है और जब तक म्युटेक्स का अधिग्रहण किया है असीम प्रतीक्षा करें।
- एप्लिकेशन के बीच डेटा पास करता है और डीबगर साझा स्मृति के 4 किलोबाइट खंड के माध्यम से किया जाता है, जिसमें म्यूटेक्स और दो ईवेंट ऑब्जेक्ट्स तक पहुंच की सुरक्षा होती है।
भले ही डीबगर संलग्न नहीं है (रिलीज मोड में) विभिन्न कर्नेल ऑब्जेक्ट्स के उपयोग के साथ आउटपुटडिबगस्ट्रिंग का उपयोग करने में महत्वपूर्ण लागत शामिल है।
यदि आप नमूना कोड और परीक्षण लिखते हैं तो प्रदर्शन हिट बहुत स्पष्ट है।
रिलीज बिल्ड में आउटपुटडिबगस्ट्रिंग() कॉल को कभी भी न छोड़ें। हमेशा #ifdef कथन का उपयोग करके उन्हें हटा दें, या उन्हें बंद करने के लिए एक और स्विच प्रदान करें।
यदि आप उन्हें छोड़ देते हैं, तो उन्हें डिफ़ॉल्ट रूप से अक्षम कर दें और केवल उन्हें अनुरोध पर सक्रिय करें, क्योंकि अन्यथा आपका ऐप अन्य ऐप्स को डीबग करना कठिन बना देगा जो अच्छा व्यवहार करते हैं (यानी, अनुरोध पर केवल आउटपुट डीबग डेटा)।
ऐप्स के आउटपुट को पकड़ने के लिए DebugView थे, लेकिन निश्चित रूप से यह अच्छा है कि प्रत्येक ऐप चैटर्स के साथ कोई अच्छा कारण न हो।
मैं इस लंबे समय के बाद इस सवाल का जवाब दिया गया है लिख रहा हूँ, लेकिन दिए गए उत्तर एक निश्चित पहलू याद आती है:
OutputDebugString काफी तेजी से हो सकता है जब कोई भी इसके उत्पादन के लिए सुन रहा है।हालांकि, पृष्ठभूमि में चलने वाला श्रोता होने (चाहे यह डीबीजीवी, डीबीविन 32, विजुअल स्टूडियो इत्यादि हो) इसे 10 गुना धीमा कर सकता है (एमटी पर्यावरण में बहुत अधिक)। उन श्रोताओं को रिपोर्ट घटना को हुक करने का कारण है, और घटना का उनका प्रबंधन आउटपुटडिबगस्ट्रिंग कॉल के दायरे में किया जाता है। इसके अलावा, अगर कई धागे आउटपुटडिबगस्ट्रिंग को समवर्ती रूप से कॉल करते हैं, तो वे सिंक्रनाइज़ हो जाएंगे। अधिक के लिए, Watch out: DebugView (OutputDebugString) & Performance देखें।
एक तरफ ध्यान दें के रूप में, मुझे लगता है कि जब तक आप एक वास्तविक समय आवेदन चला रहे हैं, तो आप उस एक सुविधा है कि 10M कॉल को चलाने के लिए 50 सेकंड लेता है के बारे में चिंतित नहीं होना चाहिए। यदि आपके लॉग में 10 एम प्रविष्टियां हैं, तो 50 सेकंड बर्बाद आपकी समस्याओं में से कम हैं, अब आपको किसी जानवर का विश्लेषण करना होगा। एक 10 के लॉग अधिक उचित लगता है, और इसे बनाने के लिए धारक के माप के अनुसार केवल 0.05 सेकंड लगेंगे।
इसलिए, यदि आपका उत्पादन एक उचित आकार के भीतर है, OutputDebugString का उपयोग कर आप इतना दर्द नहीं करना चाहिए। हालांकि, ध्यान रखें कि सिस्टम पर कोई भी इस आउटपुट को सुनना शुरू कर देता है।
मैं इस विषय के बारे में उत्सुक था इसलिए मैंने कुछ शोध किया।
मैं परिणाम, स्रोत कोड और प्रोजेक्ट फ़ाइलें पोस्ट किया है, ताकि आप अपने सेटअप के लिए परीक्षण दोहरा सकते हैं। आउटपुटडिबगस्ट्रिंग की निगरानी किए बिना किसी भी रिलीज मोड ऐप को चलाता है और फिर विजुअल स्टूडियो 6, विजुअल स्टूडियो 2005 और विजुअल स्टूडियो 2010 के साथ आउटपुट डिबगस्ट्रिंग की निगरानी करता है ताकि विजुअल स्टूडियो के प्रत्येक संस्करण के प्रदर्शन में अंतर में अंतर हो।
परिणाम दिलचस्प, विजुअल स्टूडियो 2010 प्रक्रियाओं जानकारी OutputDebugString दृश्य स्टूडियो की तुलना में धीमी 7x अप करने के लिए 6.
पूर्ण यहाँ लेख: Whats the cost of OutputDebugString?
- 1. आउटपुटडिबगस्ट्रिंग() विंडोज 7x64
- 2. "ओवरहेड"?
- 3. डेल्फी में, आउटपुटडिबगस्ट्रिंग थ्रेड सुरक्षित है?
- 4. ओवरहेड
- 5. सी ++ 0x लैम्ब्डा ओवरहेड
- 6. मैं सेवा से आउटपुटडिबगस्ट्रिंग कैसे प्राप्त कर सकता हूं?
- 7. fs.createWriteStream से जुड़े कार्यक्रम node.js
- 8. Syscall ओवरहेड
- 9. ओवरहेड फोन
- 10. सिल्वरलाइट डीबग से रिलीज
- 11. आउटपुटडिबगस्ट्रिंग के आउटपुट को कैसे देखें?
- 12. ओएस एक्स आउटपुटडिबगस्ट्रिंग() के बराबर है?
- 13. वेबआरटीसी ओवरहेड
- 14. एक गतिशील रूप से जुड़े निष्पादन योग्य गतिशील रूप से जुड़े निष्पादन योग्य से तेज है?
- 15. टीएफएस 2010 में किसी स्रोत शाखा से जुड़े कार्य आइटम कैसे निर्धारित करें?
- 16. एक जुड़े ग्राफ में पुल
- 17. नलप्टर हटाने - प्रदर्शन ओवरहेड?
- 18. एचडीएफ 5 स्टोरेज ओवरहेड
- 19. किसी भी तालिका से जुड़े रिकॉर्ड्स?
- 20. PHP फ्रेमवर्क ओवरहेड
- 21. एकल टेबल विरासत से जुड़े एचएबीटीएम एसोसिएशन
- 22. jquery। एकाधिक चयनकर्ताओं से जुड़े कंटेनर तत्व
- 23. Django, ReportLab पीडीएफ जेनरेशन ईमेल से जुड़े
- 24. जेवीएम ओवरहेड बहुत बड़ा
- 25. दृढ़ता से जुड़े घटक क्या हैं?
- 26. डब्ल्यूपीएफ बाइंडिंग ओवरहेड
- 27. लिनक्स मशीन से जुड़े सभी स्टोरेज डिवाइस
- 28. साझा ऑब्जेक्ट ओवरहेड
- 29. रेल पृष्ठभूमि कार्य ओवरहेड
- 30. डीएओ और एसक्यूएल सर्वर से जुड़े लेनदेन
ध्यान दें कि सिर्फ इस कोड चलाने पूरी कहानी नहीं है। निष्पादन बड़े पैमाने पर डीबग आउटपुट (डीबग व्यू, विजुअल स्टूडियो डीबगर इत्यादि) की निगरानी के आधार पर निर्धारित किया जाएगा, और आप जिस विंडोज़ के चल रहे संस्करण के आधार पर भिन्न हो सकते हैं, इसलिए आपको कई अलग-अलग परिस्थितियों में परीक्षण करने की आवश्यकता है। यह किसी के समय के तीन मिनट से अधिक समय लेगा। –
मैंने एक गरीब आदमी के समय (एनयूएलएल) का उपयोग कर उपरोक्त कोड स्निपेट का परीक्षण किया है - शुरू करें। आउटपुटडिबगस्ट्रिंग चालू करने पर 1000,000 बार 13 सेकंड लगते हैं, लेकिन आउटपुट कैप्चर करने के लिए डीबीजीवीयर खोलने पर कोई संलग्न डीबगर नहीं होता है, समय 16 9 सेकेंड होता है। अगर आउटपुटडिबगस्ट्रिंग बंद करें, तो मापा गया समय 0 सेकंड है। – zhaorufei