2010-08-02 15 views
9

संभावित डुप्लिकेट:
Is "else if" faster than "switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?मामला बयान या यदि बयान दक्षता परिप्रेक्ष्य

मुझे पता है कि मामले बयान कूद तालिकाओं के साथ लागू किया जा सकता। क्या यह बयान के मुकाबले ज्यादा कुशल बनाता है?

क्या यह सिर्फ सूक्ष्म अनुकूलन है जिसे टालना चाहिए?

+2

का शिकार [ "और अगर" "स्विच की तुलना में तेजी() मामले है "?] (http://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case), [जावा में स्विच स्टेटमेंट बनाम/अन्य के सापेक्ष प्रदर्शन अंतर क्या है?] (http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in), [यदि बनाम स्विच स्पीड] (http://stackoverflow.com/questions/445067/if-vs-switch-speed), आदि .. – BalusC

+0

यह एक डुप्लिक नहीं है क्योंकि यह प्रश्न जावा विशिष्ट है। – sixtyfootersdude

+1

असल में आप सही हैं। यह http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in का एक डुप्लिकेट है। यह दूसरों की एक डुप्ली नहीं है हालांकि वे जावा विशिष्ट नहीं हैं। परेशान करना कितना दक्षता और प्रदर्शन अलग-अलग टैग हैं। – sixtyfootersdude

उत्तर

35

मुझे लगता है कि मुख्य बात कोड को यथासंभव स्पष्ट रूप से लिखना है। इस तरह के माइक्रो अनुकूलन फोकस नहीं होना चाहिए।

उदाहरण के लिए

, यदि आप कुछ इस तरह है:

if (age == 10) { 
    // ... 
} else if (age == 20) { 
    // ... 
} else if (age == 30) { 
    // ... 
} else if (age == 40) { 
    // ... 
} 

तो यह एक स्विच बयान का उपयोग करने के लिए स्पष्ट है: फिर

switch (age) { 
    case 10: 
     // ... 
     break; 
    case 20: 
     // ... 
     break; 
    case 30: 
     // ... 
     break; 
    case 40: 
     // ... 
     break; 
} 

, मैं कोड के लिए सबसे आसान करने के लिए कर रही है पर ध्यान केंद्रित करेंगे नैनो-द्वितीय स्तर दक्षता लाभ के बजाय पढ़ें और बनाए रखें।

0
  1. हाँ
  2. नहीं, यह आपके प्रोग्राम डिजाइन का हिस्सा है। लेकिन आपको इस बात पर विचार करना चाहिए कि एक अति-छुटकारा पाने योग्य विधि प्रकार के परिवार के साथ एक बेहतर समाधान नहीं हो सकती है।
2

यदि आपके पास बहुत बड़ी श्रृंखला के अन्य विवरणों की श्रृंखला है, तो, हाँ, आप अंतर महसूस कर सकते हैं। लेकिन यह बहुत अवास्तविक है कि आप कभी इतनी लंबी इज़ेल श्रृंखला लिखेंगे। और यदि आपने भी किया, तो यह अभी भी बहुत ही असंभव है कि वह जगह है जहां आपकी प्रदर्शन बाधा होगी।

अपना कोड पहले पढ़ने योग्य बनाने के लिए लिखें, और प्रदर्शन अनुकूलन की आवश्यकता होने पर स्वयं को एक प्रोफाइलर द्वारा निर्देशित होने दें।

3

कोई भी कंपाइलर कूद तालिका बना देगा यदि यह सत्यापित कर सकता है कि मान उचित रूप से कॉम्पैक्ट हैं। (मुझे संदेह है कि वे इस मामले में हैं, 10. के गुणक होने के नाते)

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

जोड़ा गया: switch का उपयोग करने के लिए मुझे एक और कारण है, भले ही यह एक कूद तालिका नहीं बनाता है - एक डीबगर में कोड के माध्यम से कदम उठाने पर, यह मुझे उचित मामले में सीधे चला जाता है, बजाय मुझे कदम उठाने के बजाय बहुत झूठी if बयान। डीबग करना आसान बनाता है।

1

शायद कोई फर्क नहीं पड़ता। बाइटकोड जेवीएम में सिर्फ एक "परिवहन प्रारूप" है। क्या होता है JVM बाइटकोड प्रतिनिधित्व से बहुत अलग है।(उदाहरण: बाइटकोड फ्लोट ऑपरेशंस की पेशकश नहीं करता है, इसलिए फ्लोट + - * /% फ्लोट डबल ऑपरेशंस के रूप में किया जाता है और फिर परिणाम फ्लोट पर वापस डाला जाता है। बाइट/शॉर्ट के लिए भी सही है, वे int में परिवर्तित हो जाते हैं और फिर वापस ।) लेकिन स्विच के लिए वे दो बाइटकोड प्रारूप हैं, एक पहले से ही एक जंप टेबल के साथ। लेकिन ईमानदारी से: मैं एक प्रारूप चुनूंगा जो आपके लिए और आपके कार्यक्रम के पाठक के लिए सबसे अच्छा है। JVM बाकी करेगा। यदि आप बहुत स्मार्ट हैं तो आप JVM शायद अपना अंक प्राप्त नहीं कर सकते हैं और अंत में प्रोग्राम धीमा है।

"हम छोटे क्षमता के बारे में भूल जाना चाहिए, का कहना है कि समय की 97%: समय से पहले अनुकूलन सब बुराई की जड़ है" डी नुथ