2009-06-09 13 views
8

क्या /optimize C# compiler key द्वारा कहीं भी उपलब्ध ऑप्टिमाइज़ेशन की पूरी सूची उपलब्ध है?सी # कंपाइलर कुंजी का उद्देश्य/अनुकूलन क्या है?

संपादित करें: डिफ़ॉल्ट रूप से इसे अक्षम क्यों किया जाता है? क्या यह वास्तविक दुनिया ऐप में उपयोग करने लायक है? - यह डिफ़ॉल्ट रूप से केवल डीबग कॉन्फ़िगरेशन में और रिलीज़ में सक्षम है।

+2

मैं 11 जून को अपने ब्लॉग पर इस (अक्सर पूछे जाने वाले प्रश्न) का जवाब दे रहा हूं। –

+2

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

उत्तर

7

Scott Hanselman has a blog post जो कुछ/उदाहरण (रिलीज बिल्ड में सक्षम है) के कुछ उदाहरण दिखाता है।

सारांश के रूप में:/ऑप्टिमाइज़ कई चीजें करता है जिसमें कोई सटीक संख्या या परिभाषा नहीं दी जाती है, लेकिन अधिक दिखाई देने वाली विधि में से एक तरीका है (यदि आपके पास विधि ए() है जो बी() को कॉल करता है जो सी() को कॉल करता है कॉल डी(), कंपाइलर बी और सी को "छोड़" सकता है और सीधे ए से डी तक जा सकता है), जो रिलीज बिल्ड में "अजीब" कॉलस्टैक का कारण बन सकता है।

+0

अच्छा, धन्यवाद :-) –

2

यह डिबग बिल्ड के लिए डिफ़ॉल्ट रूप से अक्षम है। रिलीज के लिए यह सक्षम है।

यह निश्चित रूप से इस स्विच को सक्षम करने के लायक है क्योंकि संकलक आपके पास मौजूद कोड के आधार पर बहुत सारे बदलाव और अनुकूलन करता है। उदाहरण के लिए: अनावश्यक प्रारंभिकताओं को छोड़ना, तुलना जो कभी भी नहीं बदलती हैं।

नोट: अगर आपके पास अनुकूल कोड पर आपकी बारी है और उत्पन्न होने वाला आईएल कोड मेल नहीं खा सकता है तो आपको कुछ कठिनाई हो सकती है। यही कारण है कि यह केवल रिलीज बिल्ड के लिए चालू है।

+0

ओह, वास्तव में। मैं सवाल अपडेट करूंगा। लेकिन मुझे अभी भी आश्चर्य है कि अनुकूलन की सटीक (या पूर्ण पर्याप्त) सूची क्या है ... –

2

MSDN page से उद्धरित:

/अनुकूलन विकल्प सक्षम बनाता है या अपने आउटपुट फ़ाइल छोटे, तेज, और अधिक कुशल बनाने के संकलक द्वारा किया जाता अनुकूलन अक्षम करता है।

दूसरे शब्दों में, यह वही करता है जो आपको लगता है - यह संकलित सीआईएल (सामान्य इंटरमीडिएट भाषा) कोड को अनुकूलित करता है जो .NET VM द्वारा निष्पादित किया जाता है। मैं इस बारे में चिंता नहीं करता कि विशिष्ट अनुकूलन क्या हैं - यह कहने के लिए पर्याप्त है कि वे कई हैं, और शायद कुछ मामलों में काफी जटिल हैं। यदि आप वास्तव में रुचि रखते हैं कि यह किस प्रकार की चीजें करता है, तो आप शायद Mono C# Compiler की जांच कर सकते हैं (मुझे संदेह है कि एमएस सी # के बारे में विवरण सार्वजनिक हैं)।

डीबग कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट रूप से कारण अनुकूलन अक्षम कर दिया गया है यह है कि यह कुछ डीबगिंग सुविधाओं को असंभव बनाता है। कुछ उल्लेखनीय लोगों:

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

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

+0

मुझे अनुकूलन के बारे में चिंता नहीं है, मैं सिर्फ यह जानना चाहता हूं कि वे क्या हैं :-) मैं आपके ऊपर उठाना चाहता हूं प्रयास भी, लेकिन एक चीज मुझे ऐसा करने से रोकती है: ".NET VM" :-) –

+0

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

+0

@ रुई: धन्यवाद ... और हाँ, मुझे समझ में आया कि यह तकनीकी रूप से सीएलआर है, लेकिन मैं कई तर्कों के लिए अलग-अलग शब्दों का उपयोग करता हूं। हालांकि, आपकी व्याख्या चीजों को स्पष्ट करती है। यह ध्यान देने योग्य भी है कि सीएलआर के जावा समकक्ष को स्पष्ट रूप से वीएम (जेवीएम) कहा जाता है, और मेरा मानना ​​है कि एमएस भी इसे कभी-कभी वीएम के रूप में संदर्भित करता है, इसलिए इस संदर्भ में शब्द का सामान्य रूप से उपयोग किया जाता है। – Noldorin

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