2013-02-10 41 views
6

जावा बाइट कोड स्तर पर, वहाँ एक सरल अगर-कथन (उदाहरण 1) और एक सामान्य अगर बयान के बीच कोई अंतर (उदाहरण 2) है:सरल अगर बयान बनाम सामान्य अगर बयान

उदाहरण 1:

if (cond) statement; 

उदाहरण 2:

if (cond) { 
    statement; 
} 

सवाल की पृष्ठभूमि, कि मैं java.awt.Rectangle और Point केवल संस्करण की तरह "उच्च प्रदर्शन" कक्षाओं में देखा है घुंघराले ब्रेसिज़ के बिना।

क्या कोई गति लाभ है, या केवल कोड शैली है?

+0

आप इसका विश्लेषण क्यों नहीं करते? और देखें कि आपको क्या मिलता है। –

+0

मुझे डाउनवॉटर पर बाइट कोड – raceworm

+0

के साथ कोई अनुभव नहीं है: कुछ टिप्पणियां दिलचस्प होंगी। – raceworm

उत्तर

10

प्रदर्शन के संदर्भ में, आपके कोड की रखरखाव के अलावा, बिल्कुल वही है। {} के बाद से {} को हटाने से आपको गति नहीं मिलेगी, क्योंकि यह स्वयं द्वारा निर्देश नहीं है।

मैं {} के साथ सामान्य उपयोग करता हूं क्योंकि कोड को पढ़ने में आसान बनाता है (आईएमओ) और त्रुटियों को कम करने के लिए कम समर्थक बनाता है।

यह उदाहरण:

public void A(int i) { 
    if (i > 10) { 
     System.out.println("i"); 
     } 
    } 

    public void B(int i) { 
     if (i > 10) 
      System.out.println("i"); 
    } 

बाइट कोड उत्पन्न:

// Method descriptor #15 (I)V 
    // Stack: 2, Locals: 2 
    public void A(int i); 
    0 iload_1 [i] 
    1 bipush 10 
    3 if_icmple 14 
    6 getstatic java.lang.System.out : java.io.PrintStream [16] 
    9 ldc <String "i"> [22] 
    11 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24] 
    14 return 
     Line numbers: 
     [pc: 0, line: 5] 
     [pc: 6, line: 6] 
     [pc: 14, line: 8] 
     Local variable table: 
     [pc: 0, pc: 15] local: this index: 0 type: program.TestClass 
     [pc: 0, pc: 15] local: i index: 1 type: int 
     Stack map table: number of frames 1 
     [pc: 14, same] 

    // Method descriptor #15 (I)V 
    // Stack: 2, Locals: 2 
    public void B(int i); 
    0 iload_1 [i] 
    1 bipush 10 
    3 if_icmple 14 
    6 getstatic java.lang.System.out : java.io.PrintStream [16] 
    9 ldc <String "i"> [22] 
    11 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24] 
    14 return 
     Line numbers: 
     [pc: 0, line: 11] 
     [pc: 6, line: 12] 
     [pc: 14, line: 13] 
     Local variable table: 
     [pc: 0, pc: 15] local: this index: 0 type: program.TestClass 
     [pc: 0, pc: 15] local: i index: 1 type: int 
     Stack map table: number of frames 1 
     [pc: 14, same] 

आप ही कर रहे हैं देख सकते हैं।

+0

का उपयोग करता हूं, मैंने कभी भी घुंघराले संस्करण का उपयोग किया है। लेकिन जावा डेवलपर सूरज नहीं है, यहां तक ​​कि android.graphics.Rect एकल कथन के साथ संस्करण का उपयोग करता है। – raceworm

+1

@raceworm यह एक कोड सम्मेलन है, हालांकि इसका प्रदर्शन करने के लिए कुछ भी नहीं है, क्योंकि जेनरेट कोड में कोई अंतर नहीं है। – nos

+0

सही। ......, मैंने यह भी सोचा था कि अगर इस विशेष मामले में आईसीएस अधिक पठनीय है, तो सिंगल लाइन के साथ – raceworm

4

दोनों बिल्कुल वही हैं। जावा संकलन एक ही कोड का उत्पादन करेगा।

ध्यान रखें, हालांकि, कि गैर ब्रैकेट मामले में, आप अनेक उप-बयान कोष्ठकों के भीतर मामले में करने के लिए जिस तरह से आप में सक्षम हो सकता है अगर-ब्लॉक के अंदर जोड़ने के लिए सक्षम नहीं होगा

+0

क्या आपने इसका परीक्षण किया है? –

+3

कोई फर्क नहीं पड़ता। मैंने कुछ बाइटकोड निरीक्षण का उपयोग करने में परीक्षण नहीं किया है, लेकिन यदि कोई अंतर था, तो इन दो कथनों की तुलना में संकलक पेड़ एपीआई में अलग-अलग महसूस किया जाएगा (और इन दोनों के बीच कोई अंतर नहीं है) – malejpavouk

+0

और यहां तक ​​कि यदि कुछ अंतर होगा - जावा हॉटस्पॉट के साथ समय संकलक में है ... मुझे सच में संदेह है, अगर इन माइक्रोमैक्रोमिको ऑप्टिमाइज़ेशन का माप भी मापने योग्य प्रभाव हो सकता है – malejpavouk

1

आपके द्वारा दिए गए दो उदाहरण एक ही सटीक चीज करते हैं। आपका पहला उदाहरण सरल if-then-statement है, जबकि आपका दूसरा उदाहरण सामान्य है, तो कथन

उन दो कथनों को निष्पादित करने में लगने वाला समय वही है, क्योंकि ब्रेसिज़ निर्देश नहीं हैं, और इसलिए गति को प्रभावित नहीं करते हैं। हालांकि, अगर मैं कथन के बावजूद सामान्य का उपयोग करता हूं, तो आप कथन के भीतर जितना चाहें उतने बयान प्राप्त कर सकते हैं।

+0

मुझे अत्यधिक छोटे differenece में दिलचस्पी है क्योंकि मुझे इसे हजारों आयत के लिए चाहिए। मोबाइल डिवाइस पर प्रत्येक सेकेंड कॉल करें – raceworm

+0

यह ठीक है, लेकिन मैं इस तरह के छोटे लोगों पर ध्यान केंद्रित करने से पहले अन्य, बड़े प्रदर्शन-होगिंग मुद्दों पर ध्यान केंद्रित करूंगा – syb0rg

+0

एक स्थानिक सूचकांक का उपयोग करके बड़े पेफॉर्मेंस होगिंग को हल किया जाता है। – raceworm