मैं समझाने के उद्देश्य से एक साधारण वर्ग मिल गया है:जावा कंपाइलर एक छोटी विधि को अनुकूलित क्यों नहीं कर रहा है?
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
बाईटकोड संकलक (javap -c Test.class
द्वारा निरीक्षण किया) द्वारा उत्पादित निम्नलिखित है:
public int test1();
Code:
0: bipush 100
2: istore_1
3: sipush 200
6: istore_1
7: iload_1
8: ireturn
public int test2();
Code:
0: sipush 200
3: ireturn
संकलक क्यों के अनुकूलन नहीं है test2
विधि के लिए उत्पादित एक ही बाइटकोड विधि? मैं उम्मीद करता हूं कि कम से कम result
चर के अनावश्यक प्रारंभ से बचें, यह मानना आसान है कि मान 100
का उपयोग नहीं किया जाता है।
मैंने इसे ग्रहण कंपाइलर और javac
दोनों के साथ देखा।
javac
संस्करण: 1.8.0_72
, जावा के साथ एक साथ JDK के हिस्से के रूप में स्थापित:
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
* जावा भाषा विशिष्टता * इन तरह के किसी भी अनुकूलन की आवश्यकता नहीं है, इसलिए "कंपाइलर" के बारे में बात करना अर्थपूर्ण नहीं है जैसे कि केवल एक ही था। आपको इंगित करना चाहिए कि आप किस कंपाइलर का उपयोग कर रहे हैं। – ruakh
क्लासिक उत्तर यह है कि अनुकूलन JVM में किया जाता है (http://stackoverflow.com/questions/5981460/optimization-by-java-compiler) – wero
@ruakh अच्छी टिप्पणी; जोड़ा कंपाइलर जानकारी। –