2012-11-29 19 views
7

मैं Java प्रोग्राम के प्रदर्शन में सुधार करने पर काम कर रहा हूं। मैंने data structures और एल्गोरिदम की जटिलता में सुधार करने के बाद, मैं कार्यान्वयन में सुधार करने की कोशिश कर रहा हूं। मैं जानना चाहता हूं कि यह वास्तव में मायने रखता है कि मैं स्थिति में if कथन का उपयोग कैसे करता हूं।`if` स्थिति दक्षता

क्या संकलक इन दो संस्करणों का समान व्यवहार करता है? क्या वे वही खर्च करते हैं (यदि मेरे पास if कथन के अंदर बहुत अधिक चर हैं)?

if(a && b && c && d && e && f && g) 

या

if(a) 
if(b) 
    if(c) 
    if(d) 
    if(e) 
    if(f) 
     if(g) 

(इस विशेष परियोजना मैं वास्तव में पठनीयता के बारे में परवाह नहीं है, मैं जानता हूँ कि दूसरा कम पठनीय है)

+1

होने से पहले ही आप संकलक अनुकूलन मुद्दे पर आते हैं, दूसरा संस्करण निश्चित रूप से कम पठनीय है। – adarshr

+0

आप सही हैं, लेकिन इस विशिष्ट परियोजना में मुझे पठनीयता के बारे में कम ख्याल है, मैं बस अधिक कुशल कार्यान्वयन का उपयोग करना चाहता हूं क्योंकि यह इस मामले में मेरे लिए बेहद महत्वपूर्ण है। – Maroun

+0

इसे देखें [उत्तर] (http://stackoverflow.com/questions/13621324/are-variable-definitions-that-are-used-once-optimized/13621403#13621403)। इसे आपके मामले में स्थानांतरित किया जा सकता है। – jlordo

उत्तर

22

&& ऑपरेटर (और ||) जावा में शॉर्ट सर्किट ऑपरेटर है।

इसका मतलब है कि अगर afalse है, जावा का मूल्यांकन नहीं करता b, c, d आदि, क्योंकि यह पहले से ही जानता है पूरे अभिव्यक्ति a && b && c && d && e && f && gfalse होने जा रहा है।

तो if को नेस्टेड if कथन की श्रृंखला के रूप में लिखने के लिए कुछ भी प्राप्त नहीं किया जा सकता है।

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

+0

प्रदर्शन को कम कर देगी क्या आपका मतलब '||' था? क्योंकि यदि 'a' सत्य है 'जावा' a && b && c && d && e && f && g1' का मूल्यांकन जारी रखता है। यदि 'a'' false' है तो यह जानता है कि 'a && b && c && d && e && f && g1' गलत होगा। –

+0

@TheCat संपादित। – Jesper

6

किसी भी भाषा में लिखे गए प्रोग्राम को प्रोफाइल करते समय, भाषा संरचनाओं पर ध्यान केंद्रित न करें, लेकिन आपका कोड क्या कर रहा है पर ध्यान केंद्रित करें। अपना कोड समय दें, पता लगाएं कि समय कहाँ बिताया गया है, तो आपको पता चलेगा कि कारण क्या है क्योंकि इसे कम कर दिया गया होगा।

यदि आप जानते हैं कि आपके प्रोग्राम के धीमे हिस्से आपके कथन में हैं, तो आप पहले से ही अपने प्रश्न का उत्तर जान सकते हैं।

मैं इसे एक उत्तर के रूप में पोस्ट कर रहा हूं क्योंकि मुझे विश्वास है कि ऑप्टिमाइज़ेशन उद्देश्यों के लिए किसी विशेष भाषा सुविधा की दक्षता के बारे में पूछना पूरी तरह से गलत दृष्टिकोण है, और मेरा मानना ​​है कि आपको एक बहुत ही अलग रणनीति से लाभ होगा।

इसके अलावा, कुछ कार्यान्वयन चीजों को थोड़ा अलग तरीके से संभाल सकता है, इसलिए जब तक कि मानक में पत्थर में कुछ सेट न हो (और कभी-कभी, यहां तक ​​कि कोई गारंटी नहीं है), उत्तर कार्यान्वयन पर निर्भर हो सकता है, और सशर्त।

10

अन्य उत्तर के अलावा, यहां तक ​​कि एक बहुत कम स्तर पर वहाँ दो दृष्टिकोणों के बीच कोई अंतर नहीं है - वे एक ही बाईटकोड में संकलित किए जाते हैं:

boolean a=true, b=true, c=true, d=true, e=true, f=true, g=true; 
    0: iconst_1 
    1: istore_1 
    2: iconst_1 
    3: istore_2 
    4: iconst_1 
    5: istore_3 
    6: iconst_1 
    7: istore  4 
    9: iconst_1 
    10: istore  5 
    12: iconst_1 
    13: istore  6 
    15: iconst_1 
    16: istore  7 

if(a && b && c && d && e && f && g) {} 
    18: iload_1 
    19: ifeq   45 
    22: iload_2 
    23: ifeq   45 
    26: iload_3 
    27: ifeq   45 
    30: iload   4 
    32: ifeq   45 
    35: iload   5 
    37: ifeq   45 
    40: iload   6 
    42: ifeq   45 

if(a) if(b) if(c) if(d) if(e) if(f) if(g) {} 
    45: iload_1 
    46: ifeq   72 
    49: iload_2 
    50: ifeq   72 
    53: iload_3 
    54: ifeq   72 
    57: iload   4 
    59: ifeq   72 
    62: iload   5 
    64: ifeq   72 
    67: iload   6 
    69: ifeq   72 
संबंधित मुद्दे