2009-04-08 7 views

उत्तर

14

माप - 10 एम कॉल लगभग 50 सेकंड लेते हैं। मुझे लगता है कि यह अप्रयुक्त कार्यक्षमता के लिए महत्वपूर्ण ओवरहेड है।

एक मैक्रो का उपयोग करने से रिहाई निर्माण में इस से छुटकारा पाने:

#ifdef _DEBUG 
    #define LOGMESSAGE(str) OutputDebugString(str); 
#else 
    #define LOGMESSAGE(str) 
#endif 

इतना ही नहीं कॉल निकाल देता है, लेकिन यह भी मानकों के मूल्यांकन और पाठ स्ट्रिंग्स पूरी तरह से हटा दिया और उन्हें सुलझाने में नहीं देखेंगे द्विआधारी फ़ाइल।

4

इसे स्वयं क्यों मापें? निम्न कोड संकलित करें, इसे & चलाएं। फिर आउटपुटडिबगस्ट्रिंग को कॉल हटाएं, पुनः संकलित करें और पुन: चालू करें। आपके समय के तीन मिनट का समय लेना चाहिए।

#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; 
    } 
+4

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

+1

मैंने एक गरीब आदमी के समय (एनयूएलएल) का उपयोग कर उपरोक्त कोड स्निपेट का परीक्षण किया है - शुरू करें। आउटपुटडिबगस्ट्रिंग चालू करने पर 1000,000 बार 13 सेकंड लगते हैं, लेकिन आउटपुट कैप्चर करने के लिए डीबीजीवीयर खोलने पर कोई संलग्न डीबगर नहीं होता है, समय 16 9 सेकेंड होता है। अगर आउटपुटडिबगस्ट्रिंग बंद करें, तो मापा गया समय 0 सेकंड है। – zhaorufei

8

मैं जो सभी के बिल्ट-इन मेट्रिक्स है, पिछले कुछ वर्षों में सर्वर साइड रिलीज़ मोड क्षुधा के दर्जनों में एक समस्या नहीं देखा है। आप इंप्रेशन प्राप्त कर सकते हैं कि यह धीमा है क्योंकि अधिकांश डिबग-कैचर अनुप्रयोग जो आप पा सकते हैं (DBWIN32 et al) स्क्रीन पर डेटा को फेंकने में बहुत धीमी हैं, जो अंतराल की छाप देता है।

बेशक हमारे अनुप्रयोगों के सभी इस उत्पादन डिफ़ॉल्ट रूप से अक्षम है, लेकिन यह , क्षेत्र में इसे चालू करने के बाद आप तो कई अनुप्रयोगों, DBWin32 की तरह कुछ में धारावाहिक से डिबग आउटपुट देख सकते हैं सक्षम होने के लिए उपयोगी है । यह बग्स के लिए एक बहुत उपयोगी डीबगिंग तकनीक हो सकती है जिसमें अनुप्रयोगों को संचारित करना शामिल है।

+0

+1 _is उपयोगी है जो इसे field_ में चालू करने में सक्षम है –

9

मैं एक लेख है कि आंतरिक रूप से कुछ दिलचस्प बातें OutPutDebugString करता है में पढ़ा था:

  1. बनाता है \ म्युटेक्स खोलता है और जब तक म्युटेक्स का अधिग्रहण किया है असीम प्रतीक्षा करें।
  2. एप्लिकेशन के बीच डेटा पास करता है और डीबगर साझा स्मृति के 4 किलोबाइट खंड के माध्यम से किया जाता है, जिसमें म्यूटेक्स और दो ईवेंट ऑब्जेक्ट्स तक पहुंच की सुरक्षा होती है।

भले ही डीबगर संलग्न नहीं है (रिलीज मोड में) विभिन्न कर्नेल ऑब्जेक्ट्स के उपयोग के साथ आउटपुटडिबगस्ट्रिंग का उपयोग करने में महत्वपूर्ण लागत शामिल है।

यदि आप नमूना कोड और परीक्षण लिखते हैं तो प्रदर्शन हिट बहुत स्पष्ट है।

6

रिलीज बिल्ड में आउटपुटडिबगस्ट्रिंग() कॉल को कभी भी न छोड़ें। हमेशा #ifdef कथन का उपयोग करके उन्हें हटा दें, या उन्हें बंद करने के लिए एक और स्विच प्रदान करें।

यदि आप उन्हें छोड़ देते हैं, तो उन्हें डिफ़ॉल्ट रूप से अक्षम कर दें और केवल उन्हें अनुरोध पर सक्रिय करें, क्योंकि अन्यथा आपका ऐप अन्य ऐप्स को डीबग करना कठिन बना देगा जो अच्छा व्यवहार करते हैं (यानी, अनुरोध पर केवल आउटपुट डीबग डेटा)।

ऐप्स के आउटपुट को पकड़ने के लिए DebugView थे, लेकिन निश्चित रूप से यह अच्छा है कि प्रत्येक ऐप चैटर्स के साथ कोई अच्छा कारण न हो।

10

मैं इस लंबे समय के बाद इस सवाल का जवाब दिया गया है लिख रहा हूँ, लेकिन दिए गए उत्तर एक निश्चित पहलू याद आती है:

OutputDebugString काफी तेजी से हो सकता है जब कोई भी इसके उत्पादन के लिए सुन रहा है।हालांकि, पृष्ठभूमि में चलने वाला श्रोता होने (चाहे यह डीबीजीवी, डीबीविन 32, विजुअल स्टूडियो इत्यादि हो) इसे 10 गुना धीमा कर सकता है (एमटी पर्यावरण में बहुत अधिक)। उन श्रोताओं को रिपोर्ट घटना को हुक करने का कारण है, और घटना का उनका प्रबंधन आउटपुटडिबगस्ट्रिंग कॉल के दायरे में किया जाता है। इसके अलावा, अगर कई धागे आउटपुटडिबगस्ट्रिंग को समवर्ती रूप से कॉल करते हैं, तो वे सिंक्रनाइज़ हो जाएंगे। अधिक के लिए, Watch out: DebugView (OutputDebugString) & Performance देखें।

एक तरफ ध्यान दें के रूप में, मुझे लगता है कि जब तक आप एक वास्तविक समय आवेदन चला रहे हैं, तो आप उस एक सुविधा है कि 10M कॉल को चलाने के लिए 50 सेकंड लेता है के बारे में चिंतित नहीं होना चाहिए। यदि आपके लॉग में 10 एम प्रविष्टियां हैं, तो 50 सेकंड बर्बाद आपकी समस्याओं में से कम हैं, अब आपको किसी जानवर का विश्लेषण करना होगा। एक 10 के लॉग अधिक उचित लगता है, और इसे बनाने के लिए धारक के माप के अनुसार केवल 0.05 सेकंड लगेंगे।

इसलिए, यदि आपका उत्पादन एक उचित आकार के भीतर है, OutputDebugString का उपयोग कर आप इतना दर्द नहीं करना चाहिए। हालांकि, ध्यान रखें कि सिस्टम पर कोई भी इस आउटपुट को सुनना शुरू कर देता है।

2

मैं इस विषय के बारे में उत्सुक था इसलिए मैंने कुछ शोध किया।

मैं परिणाम, स्रोत कोड और प्रोजेक्ट फ़ाइलें पोस्ट किया है, ताकि आप अपने सेटअप के लिए परीक्षण दोहरा सकते हैं। आउटपुटडिबगस्ट्रिंग की निगरानी किए बिना किसी भी रिलीज मोड ऐप को चलाता है और फिर विजुअल स्टूडियो 6, विजुअल स्टूडियो 2005 और विजुअल स्टूडियो 2010 के साथ आउटपुट डिबगस्ट्रिंग की निगरानी करता है ताकि विजुअल स्टूडियो के प्रत्येक संस्करण के प्रदर्शन में अंतर में अंतर हो।

परिणाम दिलचस्प, विजुअल स्टूडियो 2010 प्रक्रियाओं जानकारी OutputDebugString दृश्य स्टूडियो की तुलना में धीमी 7x अप करने के लिए 6.

पूर्ण यहाँ लेख: Whats the cost of OutputDebugString?

संबंधित मुद्दे