2009-03-15 13 views
7

इनलाइनिंग क्या है?इनलाइनिंग कार्य

इसका उपयोग किस लिए किया जाता है?

क्या आप सी # में कुछ रेखांकित कर सकते हैं?

+0

के शब्दों में भी यह सवाल देखें:

उत्तर

25

क्या यह

सी और सी के मामले ++ आप इनलाइन कीवर्ड का उपयोग ढेर पर मानकों को आगे बढ़ाने की भूमि के ऊपर के बिना एक नियमित कॉल करने के लिए संकलक बताने के लिए में है। इसके बजाय फ़ंक्शन में यह उस मशीन कोड को सम्मिलित किया गया है जहां इसे कहा जाता था। यह कुछ परिदृश्यों में प्रदर्शन में उल्लेखनीय वृद्धि कर सकता है।

खतरों

इनलाइन समारोह के आकार में वृद्धि के रूप में काफी "इनलाइन किए जाने वाले" कमी का उपयोग करने में गति लाभ। ओवरयूज वास्तव में एक प्रोग्राम धीमा चलाने के लिए कारण बन सकता है। एक बहुत ही छोटे एक्सेसर फ़ंक्शन को रेखांकित करने से आमतौर पर कोड आकार कम हो जाएगा जबकि बहुत बड़े फ़ंक्शन को रेखांकित करने से कोड आकार में नाटकीय रूप से वृद्धि हो सकती है।

इनलाइनिंग सी में #

सी में # इनलाइनिंग JIT स्तर जिसमें JIT कम्पाइलर निर्णय करता है पर होता है। वर्तमान में सी # में कोई तंत्र नहीं है जिसे आप स्पष्ट रूप से कर सकते हैं। यदि आप जानना चाहते हैं कि जेआईटी कंपाइलर क्या कर रहा है तो आप रनटाइम पर System.Reflection.MethodBase.GetCurrentMethod().Name पर कॉल कर सकते हैं। यदि विधि रेखांकित है तो यह कॉलर का नाम बदलेगी।

सी # में आप इनलाइन को एक विधि को मजबूर नहीं कर सकते हैं लेकिन आप एक विधि को मजबूर नहीं कर सकते हैं। यदि आपको वास्तव में किसी विशिष्ट कॉलस्टैक तक पहुंच की आवश्यकता है और आपको इनलाइनिंग को हटाने की आवश्यकता है, तो आप MethodImplAttributeMethodImplOptions.NoInlining के साथ उपयोग कर सकते हैं। इसके अलावा यदि एक विधि वर्चुअल के रूप में घोषित की जाती है तो इसे जेआईटी द्वारा भी रेखांकित नहीं किया जाएगा। इसका कारण यह है कि कॉल का अंतिम लक्ष्य अज्ञात है।

More on inlining

+3

अधिक सही होने के लिए, आपके पास कंपाइलर को बताएं, "आप" संकलक को सुझाव देते हैं कि यह ध्यान दे सकता है या नहीं। " –

1

इनलाइनिंग की परिभाषा और चर्चा के लिए, see this question

सी # में आपको कंपाइलर या रन-टाइम को इनलाइन करने का निर्देश देने की आवश्यकता नहीं है क्योंकि रन-टाइम स्वचालित रूप से ऐसा करेगा।

पीएस जावा के लिए यह उत्तर भी सही है।

1

इनलाइन करने पर उसके स्थान पर एक विशेष कार्य को बुलाने की, समारोह की सामग्री को कॉल स्थल पर सीधे किया जाता है। ऐसा करने का मुख्य कारण यह है कि यह कॉलसाइट पर फ़ंक्शन सामग्री चलाकर फ़ंक्शन को कॉल करने के ऊपरी हिस्से को हटा देता है।

इसे ऑप्टिमाइज़ेशन तकनीक के रूप में उपयोग किया जाता है। सी # के मामले में, यह वास्तव में काम करने के लिए सीएलआर जेआईटी इंजन पर निर्भर करता है। रनटाइम पर, किसी विधि को संकलित करते समय, जेआईटी इंजन यह निर्धारित करने के लिए एक ह्युरिस्टिक का उपयोग करेगा कि कोई फ़ंक्शन इनलाइन उचित है या नहीं और यह एक प्रभावशाली अनुकूलन होगा। यदि ऐसा है, तो एक इनलाइन किया जाता है। http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx

सी # में एक इनलाइन मजबूर करने के लिए कोई तरीका नहीं है:

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

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