.NET में, खाली विधि कॉल को ऑप्टिमाइज़ किया जाएगा?

एक खाली विधि निकाय को देखते हुए, जेआईटी कॉल को अनुकूलित करेगा (मुझे पता है कि सी # कंपाइलर नहीं होगा)। मैं कैसे पता लगाने के बारे में जाना होगा? मुझे किस उपकरण का उपयोग करना चाहिए और मुझे कहां दिखना चाहिए?

चूंकि मुझे यकीन है कि यह पूछा जाएगा, खाली विधि का कारण प्रीप्रोसेसर निर्देश है।


@Chris: समझ में आता है, लेकिन यह विधि को कॉल अनुकूलित कर सकता है। तो विधि अभी भी मौजूद होगी, लेकिन इसे स्थिर कॉल हटाया जा सकता है (या कम से कम रेखांकित ...)

@Jon: यह सिर्फ मुझे बताता है कि भाषा संकलक कुछ भी नहीं करता है। मुझे लगता है कि मुझे क्या करना है एनजेन के माध्यम से अपना डीएल चलाएं और असेंबली को देखें।

0
ro fr bn

5 उत्तर

नहीं, खाली तरीके कभी अनुकूलित नहीं किए जाते हैं। यहां कुछ कारण दिए गए हैं:

  • विधि को ए से बुलाया जा सकता है व्युत्पन्न वर्ग, शायद एक में अलग असेंबली
  • विधि हो सकती है प्रतिबिंब का उपयोग करके बुलाया जा सकता है (भले ही यह निजी चिह्नित है)

संपादित करें: हां, उस (उत्कृष्ट) कोड प्रोजेक्ट दस्तावेज़ को देखने से JITer खाली विधियों पर कॉल को खत्म कर देगा। लेकिन मेरे द्वारा सूचीबद्ध किए गए कारणों के लिए विधियों को अभी भी संकलित किया जाएगा और आपके बाइनरी का हिस्सा होगा।

0
जोड़ा

मुझे लगता है कि आपका कोड इस प्रकार है:

void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
    //your code
#endif
}

यह अनुकूलित नहीं होगा, हालांकि:

partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

पहली खाली विधि आंशिक है, और सी # 3 कंपाइलर इसे अनुकूलित करेगा।


वैसे: यह मूल रूप से आंशिक तरीकों के लिए है। माइक्रोसॉफ्ट ने अपने लिनक्स डिजाइनरों को कोड जेनरेटर जोड़े जिन्हें उन तरीकों को कॉल करने की आवश्यकता है जो डिफ़ॉल्ट रूप से कुछ भी नहीं करते हैं।

विधि को अधिभारित करने के लिए मजबूर करने के बजाय आप आंशिक उपयोग कर सकते हैं।

अतिरिक्त खाली विधि कॉल के ऊपरी हिस्से को जोड़ने के बजाय, अगर आंशिक रूप से उपयोग नहीं किया जाता है और कोई प्रदर्शन खो जाता है तो आंशिक रूप से ऑप्टिमाइज़ किया जाता है।

0
जोड़ा
विशेषता का उपयोग [सशर्त ("COMPILER_FLAG")] का एक ही प्रभाव होगा और शायद उपयोग करने में थोड़ा आसान होगा। msdn.microsoft.com/en-us/library/4xssyw96.aspx</देखें एक>
जोड़ा लेखक Eric, स्रोत

इस चैप के पास जेआईटी अनुकूलन का काफी अच्छा उपचार है, 'विधि खाली है' के लिए पृष्ठ पर एक खोज करें, यह आलेख के लगभग आधा रास्ता है -

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

जाहिर है कि खाली तरीके प्रभावी ढंग से कोई कोड नहीं है, इनलाइनिंग के माध्यम से अनुकूलित किया जाता है।

@ क्रिस: मुझे एहसास है कि विधियां बाइनरी का हिस्सा होंगी और ये जेआईटी अनुकूलन हैं :-)। अर्ध-संबंधित नोट पर, स्कॉट हंसेलमैन के रिलीज बिल्ड कॉल स्टैक में इनलाइन करने पर काफी दिलचस्प लेख था:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

0
जोड़ा

सभी चीजें बराबर होती हैं, हां इसे अनुकूलित किया जाना चाहिए। जेआईटी उन कार्यों को रेखांकित करता है जहां उचित हैं और रिक्त कार्यों की तुलना में कुछ चीजें अधिक उपयुक्त हैं :)

यदि आप वास्तव में सुनिश्चित करना चाहते हैं तो अपवाद फेंकने के लिए अपनी खाली विधि बदलें और इसमें मौजूद स्टैक ट्रेस को प्रिंट करें।

0
जोड़ा

@ जोन लिमजाप: हम पहले ही जानते हैं कि सी # कंपाइलर खाली विधियों को अनुकूलित नहीं करता है। चूंकि आप ildasm के साथ decompiling क्या कर रहे हैं सी # कंपाइलर द्वारा उत्पन्न किया गया था ... वहाँ कोई मदद नहीं है।

0
जोड़ा