दिलचस्प पोस्ट
XML फ़ाइलों के साथ इकाई फ़्रेमवर्क फोन में फोनगैप खुला लिंक STD :: फ़ंक्शन कैसे कार्यान्वित है? जावा रनटाइम को सीरियलवर्सियनयूआईडीएस की उपेक्षा करें? एसवीजी व्यू बॉक्स विशेषता जावास्क्रिप्ट Regex को html एट्रीब्यूट्स में पाठ को बदलने के लिए मैस पर बूस्ट कैसे स्थापित करते हैं? एएसएमएक्स वेब सेवा से जेसन डेटा लौटें आईफोन कोर डेटा "स्वचालित लाइटवेट माइग्रेशन" सी ++ में अपवाद कैसे काम करते हैं (पर्दे के पीछे) लूप के लिए जावास्क्रिप्ट के द्वारा json कैसे बनाऊँ? TypeError: str बफर इंटरफ़ेस का समर्थन नहीं करता Android एमुलेटर पर रूट एक्सेस कैसे प्राप्त करें? इतिहास को बाश करने के लिए वर्तमान निर्देशिका को सहेजना PHP में गणितीय समीकरणों की प्रक्रिया करें

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

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

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

Solutions Collecting From Web of "अगर बनाम स्विच स्पीड"

कंपाइलर लागू होने पर कूद तालिकाओं का निर्माण कर सकता है। उदाहरण के लिए, जब आप तैयार किए गए कोड को देखने के लिए परावर्तक का उपयोग करते हैं, तो आप देखेंगे कि स्ट्रिंग्स पर भारी स्विच के लिए, कंपाइलर वास्तव में कोड उत्पन्न करेगा जो इन्हें भेजने के लिए एक हैश तालिका का उपयोग करता है। हैश तालिका स्ट्रिंग्स को चाबियों के रूप में और 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 तेज है रोम में कोड भी छोटा है