javac
(कुछ स्थितियों में छोड़कर जब यह अनुकूलन कर सकते हैं: निरंतर तह और मृत-कोड उन्मूलन) बाईटकोड कि मूल जावा प्रोग्राम है कि बाईटकोड उत्पन्न की एक वफादार प्रतिनिधित्व है पेश करेंगे। हालांकि, जब JIT कंपाइलर का उपयोग करता है तो अनुकूलन JVM द्वारा किया जा सकता है।
पहले परिदृश्य यह JVM तरह लग रहा है के लिए इनलाइन किए जाने वाले (तहत तरीकेhere देख सकते हैं और JVM पर एक इनलाइन किए जाने वाले उदाहरण के लिए here देखें) का समर्थन करता है।
मुझे javac
द्वारा ही इनलाइनिंग विधि के किसी भी उदाहरण नहीं मिल सका। मैंने कुछ नमूना कार्यक्रमों को संकलित करने की कोशिश की (जैसा कि आपने अपने प्रश्न में वर्णित किया है) और उनमें से कोई भी final
पर तब भी विधि को रेखांकित नहीं कर रहा था। ऐसा लगता है कि इस तरह के अनुकूलन JVM के जेआईटी कंपाइलर द्वारा किए जाते हैं, न कि javac
द्वारा।के तहत उल्लिखित "कंपाइलर" विधिhere हॉटस्पॉट जेवीएम के जेआईटी कंपाइलर प्रतीत होता है और javac
नहीं है।
मैं क्या देख सकते हैं से, javac
मृत-कोड उन्मूलन (दूसरे मामले के लिए उदाहरण देखें) और निरंतर तह का समर्थन करता है। निरंतर फोल्डिंग में, कंपाइलर निरंतर अभिव्यक्ति को पूर्ववत करेगा और रनटाइम के दौरान गणना करने के बजाए गणना मूल्य का उपयोग करेगा। उदाहरण के लिए:
public class ConstantFolding {
private static final int a = 100;
private static final int b = 200;
public final void baz() {
int c = a + b;
}
}
निम्नलिखित बाईटकोड को संकलित करता है: बाईटकोड एक sipush 300
बजाय aload
के getfield
और एक iadd
है
Compiled from "ConstantFolding.java"
public class ConstantFolding extends java.lang.Object{
private static final int a;
private static final int b;
public ConstantFolding();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public final void baz();
Code:
0: sipush 300
3: istore_1
4: return
}
ध्यान दें कि। 300
गणना मूल्य है। यह private final
चर के मामले भी है। यदि a
और b
स्थिर नहीं थे, जिसके परिणामस्वरूप बाईटकोड हो जाएगा:
Compiled from "ConstantFolding.java"
public class ConstantFolding extends java.lang.Object{
private final int a;
private final int b;
public ConstantFolding();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 100
7: putfield #2; //Field a:I
10: aload_0
11: sipush 200
14: putfield #3; //Field b:I
17: return
public final void baz();
Code:
0: sipush 300
3: istore_1
4: return
}
यहां भी एक sipush 300
प्रयोग किया जाता है।
public class InlineTest {
private static final boolean debug = false;
private void baz() {
if(debug) {
String a = foo();
}
}
private String foo() {
return bar();
}
private String bar() {
return "abc";
}
}
जो निम्नलिखित बाईटकोड देता है::
Compiled from "InlineTest.java"
public class InlineTest extends java.lang.Object{
private static final boolean debug;
public InlineTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private void baz();
Code:
0: return
private java.lang.String foo();
Code:
0: aload_0
1: invokespecial #2; //Method bar:()Ljava/lang/String;
4: areturn
private java.lang.String bar();
Code:
0: ldC#3; //String abc
2: areturn
}
आप देख सकते हैं, foo
है
दूसरे मामले (मृत-कोड उन्मूलन) के लिए, मैं निम्नलिखित परीक्षण कार्यक्रम का इस्तेमाल किया baz
में बिल्कुल नहीं कहा जाता है क्योंकि if
ब्लॉक के अंदर कोड प्रभावी रूप से "मृत" है।
सूर्य (अब ओरेकल) हॉटस्पॉट जेवीएम बाइटकोड के साथ-साथ जेआईटी संकलन की व्याख्या को जोड़ता है। जब Jte को बाइटकोड प्रस्तुत किया जाता है तो कोड को प्रारंभ में व्याख्या किया जाता है, लेकिन JVM बाइटकोड की निगरानी करेगा और अक्सर उन हिस्सों को चुनें जिन्हें अक्सर निष्पादित किया जाता है। यह इन हिस्सों को देशी कोड में ढकता है ताकि वे तेज़ी से दौड़ सकें। बाइटकोड के टुकड़े के लिए जो अक्सर उपयोग नहीं किया जाता है, यह संकलन नहीं किया जाता है। यह भी ठीक है क्योंकि संकलन में कुछ उपर है। तो यह वास्तव में ट्रेडऑफ का सवाल है। यदि आप सभी बाइटकोड को देशी कोड में संकलित करने का निर्णय लेते हैं, तो कोड में बहुत लंबी स्टार्ट-अप देरी हो सकती है।
बाइटकोड की निगरानी के अलावा, जेवीएम बाइटकोड के स्थिर विश्लेषण भी कर सकता है क्योंकि यह व्याख्यान और आगे अनुकूलन करने के लिए इसे लोड कर रहा है।
यदि आप जेवीएम द्वारा किए जाने वाले विशिष्ट प्रकार के अनुकूलन जानना चाहते हैं, तो this page ओरेकल में बहुत उपयोगी है। यह HotSpot JVM में उपयोग की जाने वाली प्रदर्शन तकनीकों का वर्णन करता है।
संक्षिप्त उत्तर: हां, जेवीएम इन प्रकार के अनुकूलन करेगा। (बशर्ते कि फ़ंक्शन कॉल polymorphic नहीं हैं और स्थिर रूप से निर्धारित किए जा सकते हैं।) – Mysticial
@Mysticial: आपको ऐसा क्या लगता है? :) मैंने यह http://www.ibm.com/developerworks/java/library/j-benchmark1/index पढ़ा था।एचटीएमएल लेकिन मैं सकारात्मक नहीं हूं मेरे पास जवाब हैं। – Schultz9999
मैंने कभी नहीं कहा कि यह हमेशा * अनुकूलन करेगा *। लेकिन आपके द्वारा दिया गया लिंक एक अच्छा पढ़ा है। – Mysticial