इनलाइनिंग जावा जस्ट-इन-टाइम कंपाइलर द्वारा निष्पादित एक अनुकूलन है।
आप एक विधि है:
public int addPlusOne(int a, int b) {
return a + b + 1;
}
जो आप इस तरह कहते हैं:
public void testAddPlusOne() {
int v1 = addPlusOne(2, 5);
int v2 = addPlusOne(7, 13);
// do something with v1, v2
}
संकलक समारोह के शरीर के साथ अपने कार्य कॉल को बदलने के लिए तय कर सकते हैं, तो परिणाम होगा प्रभावी रूप से इस तरह दिखें:
public void testAddPlusOne() {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1
// do something with v1, v2
}
कंपाइलर ओवरहेड ओ को बचाने के लिए करता है वास्तव में एक फ़ंक्शन कॉल कर रहा है, जिसमें प्रत्येक पैरामीटर को ढेर पर धक्का देना शामिल होगा।
यह स्पष्ट रूप से केवल गैर वर्चुअल फ़ंक्शंस के लिए किया जा सकता है। गौर करें कि क्या होगा यदि विधि उप वर्ग में ओवरराइड हो गई थी और विधि युक्त ऑब्जेक्ट का प्रकार रनटाइम तक ज्ञात नहीं है ... संकलक को कैसे पता चलेगा कि कौन सा कोड कॉपी करना है: बेस क्लास का विधि निकाय या उप वर्ग विधि शरीर? चूंकि जावा में डिफ़ॉल्ट रूप से सभी विधियां आभासी हैं, इसलिए आप उन लोगों को स्पष्ट रूप से चिह्नित कर सकते हैं जिन्हें final
(या उन्हें final
कक्षा में डाल दिया गया है) के रूप में ओवरराइड नहीं किया जा सकता है। यह संकलक को यह समझने में मदद करेगा कि विधि कभी खत्म नहीं होगी, और यह इनलाइन करने के लिए सुरक्षित है। (ध्यान दें कि संकलक कभी-कभी गैर-अंतिम तरीकों के लिए भी यह दृढ़ संकल्प कर सकता है।)
इसके अलावा, शब्द उद्धरण में 0 नोट करें। अंतिम विधियों को इनलाइन करने की गारंटी नहीं है। ऐसे तरीकों से आप गारंटी दे सकते हैं कि एक विधि इनलाइन करने में सक्षम नहीं है, लेकिन को इनलाइन करने के लिए कंपाइलर को कोई रास्ता नहीं है। जब भी इनलाइनिंग परिणामस्वरूप कोड की गति को चोट पहुंचाने में मदद करेगी, वैसे भी यह आपके बारे में हमेशा बेहतर होगा।
लाभ और समस्याओं के अच्छे अवलोकन के लिए wikipedia देखें।
स्रोत
2010-10-13 14:59:59
यह मददगार होगा: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html#vm – codaddict