2012-06-11 11 views
9

कोड ऑप्टिमाइज़ेशन के उद्देश्य के लिए #if (DEBUG) प्रीप्रोसेसर निर्देश में Debugger.Log() पर कॉल को लपेटना आवश्यक है, या RELEASE कॉन्फ़िगरेशन बनाते समय सी # कंपाइलर अभी भी अनुकूलित कोड का उत्पादन करेगा?क्या मुझे #if (DEBUG) में Debugger.Log() को कॉल लपेटना चाहिए?

उत्तर

5

वहाँ किसी भीविज्ञप्ति मोड में इस फोन पर अनुकूलन की तरह नहीं है।

कॉल IL में मौजूद है। केवल अंतर यह है कि DEBUGGER मौजूद नहीं होने पर इसका कोई प्रभाव नहीं पड़ता है।

प्रलेखन Debugger.Log से

:

अगर कोई डिबगर संलग्न है, इस विधि कोई प्रभाव नहीं है।

मैं आपके ऐप के प्रदर्शन को मापने का सुझाव दूंगा और उसके बाद अनुसरण करने के लिए चरणों का चयन करें।

यदि कोई महत्वपूर्ण अंतर नहीं है (आपके ऐप के दृष्टिकोण से), तो मैं उस लॉग को छोड़ दूंगा।

इस तरह, जरूरत के क्षण में, आप अपने ऐप में डीबगर के साथ देते हैं और आपको संदेश भेजे जाने लॉग से आवश्यकता हो सकती है के रूप में Debugger.Logकि बिंदु पर काम करेगा मिल सकती है।

0

निम्नलिखित कोड का एक त्वरित परीक्षण (नेट 4, रिलीज, किसी भी सीपीयू)

class Program 
{ 
    static void Main(string[] args) 
    { 
    #if (DEBUG) 
     Debugger.Log(0, "category", "msg"); 
    #endif 
    } 
} 

इस आईएल

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: ret 
} 

आप देख सकते हैं वहाँ Debugger.Log लिए कोई कॉल नहीं है पैदा करता है।

1

यह Debugger.Log() के लिए घोषणा है, संदर्भ स्रोत से लिया गया है:

// Posts a message for the attached debugger. If there is no 
// debugger attached, has no effect. The debugger may or may not 
// report the message depending on its settings. 
[MethodImplAttribute(MethodImplOptions.InternalCall)] 
public static extern void Log(int level, String category, String message); 

नोट कोई [सशर्त] पद्धति पर विशेषता है और यह [MethodImplAtttribute] विशेषता वहन करती है। जिसका अर्थ है कि विधि वास्तव में सीएलआर में लागू की गई है, जिसे सी ++ कोड में लिखा गया है।

तो विधि कॉल कॉन्फ़िगरेशन के बावजूद किया जाएगा। आप एसएससीएलआई 20 स्रोत वितरण, clr/src/vm/debugdebugger.cpp से विधि के कार्यान्वयन को पा सकते हैं। यह OutputDebugString() का उपयोग करता है, एक Winapi फ़ंक्शन जो डीबगर में स्ट्रिंग प्रदर्शित करता है, अगर कोई संलग्न है। या SysInternals 'DbgView.exe जैसी उपयोगिता में। यदि न तो मौजूद है तो एपीआई कॉल कुछ भी नहीं करता है और जल्दी से लौटाता है। आप केवल फ़ंक्शन कॉल ओवरहेड के लिए भुगतान करते हैं, कुछ हनोसेकंड्स का मुट्ठी भर।

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

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