2012-12-06 5 views
9

मैंने रिलीज मोड में संकलन सुना है डीबग मोड की तुलना में अनुकूलित कोड जेनरेट करता है, जो ठीक है।विभिन्न आईएल कोड + अलग मशीन कोड उत्पन्न करने के लिए रिलीज और डीबग संकलित कर रहा है?

लेकिन आईएल में यह अनुकूलन है? सीएलआर इसे चलाने के बाद यह मशीन कोड में है? रिलीज और डीबग में संकलित पीई से मेटाडाटा संरचना अलग है?

धन्यवाद

+0

अच्छा सवाल है, लेकिन आप क्यों जानना चाहते हैं? – Cameron

+2

क्योंकि मुझे नौकरी साक्षात्कार में खारिज कर दिया गया और उसे बंद कर दिया गया। मुझे लगता है कि डेवलपर्स को यह पता होना चाहिए कि वे चीजें दृश्यों के पीछे कैसे काम करती हैं – RollRoll

+0

महान सवाल! – nawfal

उत्तर

14

रिलीज बिल्ड में बिल्डिंग सी # कंपाइलर के लिए/अनुकूलित संकलन विकल्प पर बदल जाती है। इसमें कुछ दुष्प्रभाव हैं, आईएल वास्तव में बदलता है लेकिन एक बड़ा सौदा नहीं है। उल्लेखनीय है कि संकलक अब कोड को पूरी तरह से डिबग करने योग्य बनाने का प्रयास नहीं करता है। उदाहरण के लिए यह एक खाली स्थिर कन्स्ट्रक्टर छोड़ देता है, यह अब एनओपी ऑपकोड को उत्सर्जित नहीं करता है जो आपको घुंघराले ब्रेस पर ब्रेकपॉइंट सेट करने की अनुमति देता है और स्टैक फ्रेम में ओवरलैप करने के लिए अलग-अलग क्षेत्रों के साथ स्थानीय चर को अनुमति देता है। छोटी चीजें

असेंबली के लिए उत्सर्जित [डीबग्रेबल] विशेषता सबसे महत्वपूर्ण अंतर है, इसकी IsJITOptimizerDisabled संपत्ति झूठी है।

जो वास्तविक अनुकूलक पर मुड़ता है, जो कि जिटर में बनाया गया है। आपको this answer में निष्पादन की सूची मिल जाएगी। इस दृष्टिकोण की उपयोगिता, किसी भी भाषा लाभ को संकलक के बजाय जिटर में कोड ऑप्टिमाइज़र रखने से ध्यान दें।

तो संक्षेप में, आईएल में बहुत मामूली परिवर्तन, जेनरेट किए गए मशीन कोड में बहुत बड़े बदलाव।

+2

कमाल का जवाब। – RollRoll

3

हाँ, वहाँ आईएल में कुछ अनुकूलन है - विशेष रूप से, डिबग संस्करण एनओपी निर्देश जो यह आसान एक डिबगर ब्रेक अंक सम्मिलित करने के लिए के लिए बनाने में शामिल होंगे, मेरा मानना ​​है। प्रदान की गई डीबग जानकारी के स्तर के मामले में संभावित अंतर भी हैं (रेखा संख्या आदि)।

मेरा सुझाव है कि आप एक छोटा नमूना कार्यक्रम लें, इसे दोनों तरीकों से संकलित करें, और फिर ildasm में आउटपुट देखें। वहाँ कुछ मतभेद हैं लेकिन मुझे लगता है -

सी # संकलक नहीं करता है ज्यादा अनुकूलन - JIT कम्पाइलर कि के सबसे करता है।

+0

धन्यवाद, क्या आपको यह जानना होगा कि संकलन मोड के आधार पर मेटाडेटा संरचना बदल दी गई है या नहीं? – RollRoll

+0

@EdwinSoho: यह अभी भी वही * प्रारूप * है। यह वास्तव में "संरचना" से आपका क्या मतलब है इस पर निर्भर करता है। –

1

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

0

वीबी में निष्पादन योग्य में संकलित संपादन + जारी समर्थन का दुष्प्रभाव होता है, जो स्मृति रिसाव का कारण बन सकता है। यह किसी भी घटना से प्रभावित होता है जिसे WithEvents कीवर्ड के साथ घोषित किया जाता है। एक कमजोरता उन घटनाओं के उदाहरणों का ट्रैक रखती है। समस्या यह है कि यदि आप डीबगर के बिना ऐप चलाते हैं तो वेक रेफरेंस लीक हो जाते हैं। जिस प्रक्रिया पर प्रक्रिया स्मृति का उपभोग करती है वह इस बात पर निर्भर करती है कि कक्षा के कितने उदाहरण बनाए जाते हैं। रिसाव प्रति ऑब्जेक्ट प्रति घटना 16 बाइट्स है।

अस्वीकरण: हंस 'जवाब here

देखें this Microsoft knowledge base article से नकल।

0

यह सटीक प्रश्न का उत्तर नहीं है।बस यह जोड़ने के लिए कि आप उद्देश्य से चिह्नित कर सकते हैं कि डीबग मोड में कौन सा कोड चलाना है और प्रीप्रोसेसर मार्कअप की सहायता से रिलीज मोड में कौन सा कोड चलाना है।

#if DEBUG 
    // code only meant for debug mode 
#endif 

#if NOT DEBUG 
    // code only meant for release mode 
#endif 

तो यदि आप ऐसा करते हैं तो आपको अलग आईएल उत्पन्न होगा।

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