2008-08-14 5 views
20

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

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


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

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

उत्तर

1

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

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

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

1

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

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

12

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

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

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

@ क्रिस: मुझे एहसास है कि विधियां बाइनरी का हिस्सा होंगी और ये जेआईटी अनुकूलन हैं :-)।

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

0

@Jon Limjap: एक अर्द्ध संबंधित नोट पर, स्कॉट Hanselman रिलीज निर्माण कॉल के ढेर में इनलाइन किए जाने पर काफी एक दिलचस्प लेख था हम पहले से ही पता सी # संकलक खाली तरीकों बाहर अनुकूलन नहीं करता। चूंकि आप ildasm के साथ decompiling क्या कर रहे हैं सी # कंपाइलर द्वारा उत्पन्न किया गया था ... वहाँ कोई मदद नहीं है।

10

मेरा अनुमान है कि तरह अपने कोड है:

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

यह बाहर अनुकूलित नहीं किया जाएगा, लेकिन:

partial void DoSomethingIfCompFlag(); 

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

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


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

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

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

+1

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