हॉटस्पॉट जेआईटी केवल उन तरीकों को रेखांकित करता है जो एक निश्चित (कॉन्फ़िगर करने योग्य) आकार से कम हैं। तो छोटे तरीकों का उपयोग करने से अधिक इनलाइनिंग की अनुमति मिलती है, जो कि अच्छा है।
this page पर विभिन्न इनलाइनिंग विकल्पों को देखें।
संपादित
एक छोटे से विस्तार करने के लिए:
- यदि एक विधि यह inlined हो जाएगी तो वहाँ छोटे तरीकों में कोड बंटवारे के लिए दंडित करने के लिए संभावना बहुत कम है छोटा है।
- कुछ मामलों में, विभाजन विधियों के परिणामस्वरूप अधिक इनलाइनिंग हो सकती है।
उदाहरण (पूर्ण कोड एक ही लाइन नंबर यदि आप इसे करने की कोशिश करने के लिए)
package javaapplication27;
public class TestInline {
private int count = 0;
public static void main(String[] args) throws Exception {
TestInline t = new TestInline();
int sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += t.m();
}
System.out.println(sum);
}
public int m() {
int i = count;
if (i % 10 == 0) {
i += 1;
} else if (i % 10 == 1) {
i += 2;
} else if (i % 10 == 2) {
i += 3;
}
i += count;
i *= count;
i++;
return i;
}
}
निम्नलिखित JVM झंडे के साथ इस कोड को चलाते समय: -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -XX:FreqInlineSize=50 -XX:MaxInlineSize=50 -XX:+PrintInlining
(हाँ मैं का इस्तेमाल किया है मानों साबित मेरी मामला: m
बहुत बड़ा है लेकिन दोनों रिफैक्टर m
और m2
थ्रेसहोल्ड से नीचे हैं - अन्य मानों के साथ आपको एक अलग आउटपुट मिल सकता है)।
आपको लगता है कि m()
और main()
संकलित हो देखेंगे, लेकिन m()
inlined नहीं प्राप्त करता है:
56 1 javaapplication27.TestInline::m (62 bytes)
57 1 % javaapplication27.TestInline::main @ 12 (53 bytes)
@ 20 javaapplication27.TestInline::m (62 bytes) too big
तुम भी पुष्टि करते हैं कि m
inlined नहीं है उत्पन्न विधानसभा निरीक्षण कर सकते हैं (मैं इन JVM झंडे का इस्तेमाल किया: -XX:+PrintAssembly -XX:PrintAssemblyOptions=intel
) - यह इस तरह दिखेगा:
0x0000000002780624: int3 ;*invokevirtual m
; - javaapplication27.TestInline::[email protected] (line 10)
आप इस तरह कोड refactor हैं (मैं निकाला है यदि/बाकी एक अलग विधि में):
public int m() {
int i = count;
i = m2(i);
i += count;
i *= count;
i++;
return i;
}
public int m2(int i) {
if (i % 10 == 0) {
i += 1;
} else if (i % 10 == 1) {
i += 2;
} else if (i % 10 == 2) {
i += 3;
}
return i;
}
आप निम्न संकलन कार्रवाई देखेंगे:
60 1 javaapplication27.TestInline::m (30 bytes)
60 2 javaapplication27.TestInline::m2 (40 bytes)
@ 7 javaapplication27.TestInline::m2 (40 bytes) inline (hot)
63 1 % javaapplication27.TestInline::main @ 12 (53 bytes)
@ 20 javaapplication27.TestInline::m (30 bytes) inline (hot)
@ 7 javaapplication27.TestInline::m2 (40 bytes) inline (hot)
तो m2
m
में inlined हो जाता है, जो आप तो हम वापस मूल परिदृश्य के लिए कर रहे हैं उम्मीद करेंगे। लेकिन जब main
संकलित हो जाता है, तो यह वास्तव में पूरी चीज को रेखांकित करता है। असेंबली स्तर पर, इसका मतलब है कि आपको कोई भी invokevirtual
निर्देश नहीं मिलेगा। आपको इस तरह की रेखाएं मिलेंगी:
0x00000000026d0121: add ecx,edi ;*iinc
; - javaapplication27.TestInline::[email protected] (line 33)
; - javaapplication27.TestInline::[email protected] (line 24)
; - javaapplication27.TestInline::[email protected] (line 10)
जहां मूल रूप से सामान्य निर्देश "पारस्परिक" होते हैं।
निष्कर्ष
मैं कर रहा हूँ नहीं कह रही है कि इस उदाहरण प्रतिनिधि है, लेकिन यह कुछ बिंदुओं साबित करने के लिए लगता है:
- छोटे पद्धति का उपयोग करके
- छोटे तरीकों आम तौर पर होगा अपने कोड में पठनीयता में सुधार रेखांकित किया जा सकता है, इसलिए आप संभवतः अतिरिक्त विधि कॉल की लागत का भुगतान नहीं करेंगे (यह निष्पादन तटस्थ होगा)
- छोटी विधियों का उपयोग के रूप में ऊपर
और अंत में उदाहरण के द्वारा दिखाए गए कुछ परिस्थितियों में विश्व स्तर पर इनलाइन किए जाने वाले सुधार हो सकता है, यदि आपके कोड के एक हिस्से को वास्तव में प्रदर्शन के लिए महत्वपूर्ण है कि इन विचारों में कोई फर्क है, तो आप ठीक धुन पर JIT आउटपुट का परीक्षण करना चाहिए आपका कोड और महत्वपूर्ण रूप से पहले और बाद में प्रोफाइल।
सामान्य जेआईटी संकलन प्रक्रिया में इन चरणों का समावेश होता है ..http: //publib.boulder.ibm.com/infocenter/java7sdk/v7r0/index.jsp? Topic =% 2Fcom.ibm.java.win.70.doc % 2Fdiag% 2 फंडांडिंग% 2Fjit_overview.html, लेकिन यह इस बारे में बात नहीं करता है कि कैसे गीट बड़े या छोटे मॉड्यूल को नियंत्रित करता है – AurA