दिलचस्प पोस्ट
मैं वर्तमान स्क्रीन अभिविन्यास कैसे प्राप्त करूं? क्या मुझे धारा (ऑब्जेक्ट) के लिए बंद () या डिस्पोज़ () को कॉल करना चाहिए? मैं शॉर्टहैंड का उपयोग कैसे करूँ / अगर अन्य? पीडीओ के साथ WHERE इन खंड के लिए बाध्यकारी मापदंड एमवीपी और एमवीसी क्या हैं और अंतर क्या है? SQL सर्वर में डायनेमिक धुएं कॉलम 'अजगर' को आंतरिक या बाहरी कमान के रूप में मान्यता नहीं दी गई है मैं कोडा के माध्यम से पायथन ओपनसीवी कैसे स्थापित करूं? लूप के लिए क्लिक संचालकों को असाइन करें java.lang.IllegalArgumentException: एक पथ विभाजक है सी ++ स्थैतिक सदस्य प्रायः (अंदर टेम्पलेट मज़ेदार) संपत्ति पथ में सभी चरणों का पता लगाना एक स्थानांतरित पैटर्न के लिए एक स्ट्रिंग से बचें php – एक गूंज स्ट्रिंग में एक चर डालें कार्रवाई के बाद अधिसूचना को खारिज करने का तरीका क्लिक किया गया है

अगर बनाम स्विच स्पीड

स्विच स्टेटमेंट आमतौर पर तुलनात्मक रूप से तेज है यदि -आइ-अगर स्टेटमेंट (जैसे कि इस आलेख में विलुप्त होकर) कंपाइलर ऑप्टिमाइजेशन के कारण।

यह अनुकूलन वास्तव में कैसे काम करता है? क्या कोई अच्छी स्पष्टीकरण है?

वेब के समाधान से एकत्रित समाधान "अगर बनाम स्विच स्पीड"

कंपाइलर लागू होने पर कूद तालिकाओं का निर्माण कर सकता है। उदाहरण के लिए, जब आप तैयार किए गए कोड को देखने के लिए परावर्तक का उपयोग करते हैं, तो आप देखेंगे कि स्ट्रिंग्स पर भारी स्विच के लिए, कंपाइलर वास्तव में कोड उत्पन्न करेगा जो इन्हें भेजने के लिए एक हैश तालिका का उपयोग करता है। हैश तालिका स्ट्रिंग्स को चाबियों के रूप में और case कोड के प्रतिनिधियों को मानों के रूप में उपयोग करती है।

यह बहुत ज्यादा श्रृंगार की तुलना में अस्सिम्प्टिक बेहतर रनटाइम है if टेस्ट और वास्तव में अपेक्षाकृत कुछ तारों के लिए भी तेज़ है

कोनराड सही है। पूर्णांक के समीपवर्ती श्रेणियों पर स्विच करने के मामले में (उदाहरण के लिए, जहां आपके पास मामला 0, मामला 1, मामला 2 है .. केस n), कंपाइलर कुछ भी बेहतर कर सकता है क्योंकि उसे भी एक हैश तालिका बनाने की ज़रूरत नहीं है; यह केवल फ़ंक्शन पॉइंटर्स की एक सरणी को संग्रहीत करता है, और इस तरह लगातार समय में अपने कूद लक्ष्य को लोड कर सकता है।

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

एनोहू, कोनराड के जवाब का एक विस्तार यह है कि संकलक एक जंप टेबल उत्पन्न कर सकता है, लेकिन यह आवश्यक नहीं है (और वांछनीय)। विभिन्न कारणों के लिए ताल तालिकाओं को आधुनिक प्रोसेसर पर शाखा की भविष्यवाणियों में बुरी चीजें होती हैं, और टेबल खुद को कैश व्यवहार के लिए बुरी बातें करते हैं, उदा।

 switch(a) { case 0: ...; break; case 1: ...; break; } 

अगर एक कंपाइलर ने वास्तव में इसके लिए एक जंप टेबल तैयार की तो यह शायद धीमी हो जाएगी कि वैकल्पिक..यदि if..else if.. शाखा की वजह से if..else if.. की भविष्यवाणी को if..else if.. वजह से शैली कोड होता है।

जैसा कि कोनराड ने कहा कि कंपाइलर एक जंप टेबल बना सकता है।

सी ++ में एक कारण यह स्विच की सीमा के कारण हो सकता है।

  • तुलना अवधि को किसी int में परिवर्तित किया जाना चाहिए ।
  • मामले labl एक स्थिर होना चाहिए।

स्विच / केस ब्योरा आम तौर पर 1-स्तरीय गहरा हो सकता है, लेकिन जब आप 2 या अधिक में प्रवेश करना शुरू करते हैं, स्विच / केस स्टेटमेंट 2-3 बार जब नेस्टेड I

जब इस तरह के बयानों को नीडि़त किया जाता है तो इस लेख में गति अंतर पर प्रकाश डालने वाली कुछ गति की तुलना होती है।

उदाहरण के लिए, उनके परीक्षणों के अनुसार, नमूना कोड निम्न की तरह है:

 if (x % 3 == 0) if (y % 3 == 0) total += 3; else if (y % 3 == 1) total += 2; else if (y % 3 == 2) total += 1; else total += 0; else if (x % 3 == 1) if (y % 3 == 0) total += 3; else if (y % 3 == 1) total += 2; else if (y % 3 == 2) total += 1; else total += 0; else if (x % 3 == 2) if (y % 3 == 0) total += 3; else if (y % 3 == 1) total += 2; else if (y % 3 == 2) total += 1; else total += 0; else if (y % 3 == 0) total += 3; else if (y % 3 == 1) total += 2; else if (y % 3 == 2) total += 1; else total += 0; 

आधे समय में बराबर स्विच / केस स्टेटमेंट समाप्त हो गया:

 switch (x % 3) { case 0: switch (y % 3) { case 0: total += 3; break; case 1: total += 2; break; case 2: total += 1; break; default: total += 0; break; } break; case 1: switch (y % 3) { case 0: total += 3; break; case 1: total += 2; break; case 2: total += 1; break; default: total += 0; break; } break; case 2: switch (y % 3) { case 0: total += 3; break; case 1: total += 2; break; case 2: total += 1; break; default: total += 0; break; } break; default: switch (y % 3) { case 0: total += 3; break; case 1: total += 2; break; case 2: total += 1; break; default: total += 0; break; } break; } 

हाँ यह एक मामूली उदाहरण है, लेकिन यह बिंदु को दर्शाता है

तो एक निष्कर्ष सरल प्रकारों के लिए स्विच / केस का प्रयोग हो सकता है जो केवल एक स्तर की गहरी है, लेकिन अधिक जटिल तुलना और कई नेस्टेड स्तरों के लिए क्लासिक का उपयोग करते हैं यदि / और निर्मित होते हैं?

नं-मैच के आंकड़े अच्छे नहीं हो सकते हैं

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

और अधिक रोचक मामला तब होता है जब हर मामले में मेरी राय में टूट नहीं होता है, लेकिन यह प्रयोग का दायरा नहीं हो सकता है।

सी भाषा में यह पीआईसी 18 माइक्रोकंट्रोलर के लिए कोड है:

 void main() { int s1='0'; int d0; int d1; //if (s1 == '0') {d1 = '0'; d0 = '0';} //else if (s1 == '1') {d1 = '0';d0 = '1';} //else if (s1 == '2') {d1 = '1';d0 = '0';} //else if (s1 == '3') {d1 = '1';d0 = '1';} switch (s1) { case '0': {d1 = '0';d0 = '0';} break; case '1': {d1 = '0';d0 = '1';} break; case '2': {d1 = '1';d0 = '0';} break; case '3': {d1 = '1';d0 = '1';} break; } } 

आईओएस के साथ

 s1='0' - 14 cycles s1='1' - 21 cycles s1='2' - 28 cycles s1='3' - 33 cycles s1='4' - 34 cycles 

मामलों के साथ

 s1='0' - 17 cycles s2='1' - 23 cycles s3='2' - 29 cycles s4='3' - 35 cycles s5='4' - 32 cycles 

तो मुझे लगता है कि बहुत कम स्तर पर IFs तेज है रोम में कोड भी छोटा है