2015-05-22 2 views
9

में "if" स्थितियों का अजीब अनुकूलन मैंने जावा कंपाइलर की दृढ़ता की जांच करने का निर्णय लिया है; इस प्रकार, मैंने एक साधारण वर्ग लिखा है।जावा

public class Foo { 
    public Foo(boolean a, int b) { 
     if (a == true && a != false) { 
      b = 1; 
     } 
    } 
} 

मैं सोच रहा था कि क्या संकलक की तरह सरल कुछ करने के लिए शर्त को अनुकूलित करेंगे:

if (a == true) {} 

मैं कक्षा संकलित और फिर javap उपकरण के साथ यह disassembled। जब मैंने आउटपुट पर एक नज़र डाली, तो मैं वास्तव में डंबफॉल्ड था, क्योंकि कंपाइलर इन दोनों स्थितियों की जांच करता है, जो नीचे स्पष्ट रूप से दिखाया गया है।

Compiled from "Foo.java" 
public class Foo { 
    public Foo(boolean, int); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: iload_1 
     5: iconst_1 
     6: if_icmpne  15 
     9: iload_1 
     10: ifeq   15 
     13: iconst_1 
     14: istore_2 
     15: return 
} 

मैं बस उत्सुक हूँ, क्यों यह निरर्थक निर्देश निष्पादित हो रहा है, जब यह सरल कुछ करने के लिए अनुकूलित किया जा सकता है?

+1

यह एक आम उपयोग केस नहीं होना चाहिए। कंपाइलर्स का उद्देश्य उन चीजों को संकलित करने से रोकना और रोकना है जो कोई समझ नहीं लेते हैं। – itachi

+1

@itachi वास्तव में नहीं। कोड लिखने के बहुत सारे बेवकूफ तरीके हैं, और उन सभी के लिए ऑप्टिमाइज़ेशन लिखने से संकलक को बनाए रखने और बग्स को स्वयं प्रवण करने में कठिनाई होती है। – RealSkeptic

+0

माइनक्राफ्ट को पूरी तरह से उलट करने के बाद, मैं सुरक्षित रूप से कह सकता हूं कि जावा बहुत कम है, अगर कोई है, अर्थपूर्ण अनुकूलन। – Qix

उत्तर

13

javac कोई या केवल छोटा अनुकूलन नहीं करता है। ऑप्टिमाइज़ेशन बाइटकोड के केवल-इन-टाइम (जेआईटी) संकलन के दौरान होता है। यह समझ में आता है, क्योंकि इस दृष्टिकोण के साथ आप विभिन्न लक्ष्य प्लेटफ़ॉर्म के लिए अलग-अलग अनुकूलित कर सकते हैं और अधिकतम अनुकूलन परिणाम प्राप्त कर सकते हैं।