CIL स्विच निर्देश के साथ C # स्विच स्टेटमेंट को भ्रमित न करना महत्वपूर्ण है।
CIL स्विच एक जम्प टेबल है, जिसमें जम्प पतों के एक इंडेक्स की आवश्यकता होती है।
यह तभी उपयोगी है जब C # स्विच के मामले आसन्न हों:
case 3: blah; break;
case 4: blah; break;
case 5: blah; break;
लेकिन बहुत कम उपयोग अगर वे नहीं हैं:
case 10: blah; break;
case 200: blah; break;
case 3000: blah; break;
(आपको केवल 3 स्लॉट के साथ आकार में तालिका ~ 3000 प्रविष्टियों की आवश्यकता होगी)
गैर-आसन्न अभिव्यक्तियों के साथ, कंपाइलर रैखिक प्रदर्शन करना शुरू कर सकता है अगर-और-अगर-तो-और चेक।
बड़े गैर-आसन्न अभिव्यक्ति सेटों के साथ, कंपाइलर एक बाइनरी ट्री खोज के साथ शुरू हो सकता है, और अंत में अगर-और-अगर-पिछले कुछ आइटम।
आसन्न वस्तुओं के थक्कों वाले अभिव्यक्ति सेट के साथ, कंपाइलर बाइनरी ट्री सर्च कर सकता है, और अंत में एक CIL स्विच कर सकता है।
यह "मेस" और "मैट्स" से भरा है, और यह कंपाइलर (मोनो या रोटर के साथ भिन्न हो सकता है) पर निर्भर है।
मैंने अपने मशीन पर आसन्न मामलों का उपयोग करके आपके परिणामों को दोहराया:
10 रास्ता स्विच निष्पादित करने के लिए कुल समय, 10000 पुनरावृत्तियों (एमएस): 25.1383
अनुमानित 10 प्रति स्विच स्विच (एमएस): 0.00251383
50 रास्ता स्विच, 10000 पुनरावृत्तियों (एमएस) को निष्पादित करने का कुल समय: 26.593
अनुमानित 50 प्रति स्विच स्विच (एमएस): 0.0026593
5000 रास्ता स्विच को निष्पादित करने का कुल समय, 10000 पुनरावृत्तियों (एमएस): 23.7094
अनुमानित समय 5000 प्रति स्विच (एमएस): 0.00237094
50000 रास्ता स्विच, 10000 पुनरावृत्तियों (एमएस) को निष्पादित करने का कुल समय: 20.0933
प्रति 50000 स्विच (एमएस) प्रति अनुमानित समय: 0.00200933
फिर मैंने गैर-आसन्न केस एक्सप्रेशन का उपयोग भी किया:
10 रास्ता स्विच, 10000 पुनरावृत्तियों (एमएस) को निष्पादित करने का कुल समय: 19.6189
अनुमानित 10 प्रति स्विच स्विच (एमएस): 0.00196189
500 रास्ता स्विच, 10000 पुनरावृत्तियों (एमएस) को निष्पादित करने का कुल समय: 19.1664
अनुमानित समय 500 प्रति स्विच (एमएस): 0.00191664
5000 रास्ता स्विच को निष्पादित करने का कुल समय, 10000 पुनरावृत्तियों (एमएस): 19.5871
अनुमानित समय 5000 प्रति स्विच (एमएस): 0.00195871
एक गैर-आसन्न 50,000 केस स्विच स्टेटमेंट संकलित नहीं होगा।
"'ConsoleApplication1.Program.Main (string []) के पास संकलन करने के लिए एक अभिव्यक्ति बहुत लंबी या जटिल है
यहाँ क्या मजेदार है, यह है कि बाइनरी ट्री सर्च सीआईएल स्विच इंस्ट्रक्शन की तुलना में थोड़ा (शायद सांख्यिकीय रूप से नहीं) तेज दिखाई देता है।
ब्रायन, आपने " निरंतर " शब्द का उपयोग किया है , जिसका कम्प्यूटेशनल जटिलता सिद्धांत के दृष्टिकोण से बहुत ही निश्चित अर्थ है। यद्यपि सरलीकृत समीपवर्ती पूर्णांक उदाहरण CIL का उत्पादन कर सकता है जिसे O (1) (स्थिर) माना जाता है, एक विरल उदाहरण O (log n) (लघुगणक) है, संकुल उदाहरण बीच में कहीं झूठ बोलते हैं और छोटे उदाहरण O (n) (रैखिक) )।
यह स्ट्रिंग स्थिति को भी संबोधित नहीं करता है, जिसमें एक स्थैतिक Generic.Dictionary<string,int32>बनाया जा सकता है, और पहले उपयोग पर निश्चित ओवरहेड भुगतना होगा। यहां का प्रदर्शन प्रदर्शन पर निर्भर करेगा Generic.Dictionary।
यदि आप C # Language Specification (CIL स्पेक नहीं) की जांच करते हैं, तो आपको "15.7.2 मिलेगा। स्विच स्टेटमेंट" में "निरंतर समय" का कोई उल्लेख नहीं है या यह कि अंतर्निहित कार्यान्वयन CIL स्विच इंस्ट्रक्शन का उपयोग भी करता है (मानने में बहुत सावधानी बरतें) ऐसी बातें)।
दिन के अंत में, एक आधुनिक सिस्टम पर पूर्णांक अभिव्यक्ति के खिलाफ एक सी # स्विच एक उप-माइक्रोसेकंड ऑपरेशन है, और आमतौर पर इसके बारे में चिंता करने योग्य नहीं है।
बेशक ये समय मशीनों और स्थितियों पर निर्भर करेगा। मैं इन समय परीक्षणों पर ध्यान नहीं दूंगा, हम जिस माइक्रोसेकंड अवधि की बात कर रहे हैं, वह किसी भी "वास्तविक" कोड द्वारा चलाया जा रहा है (और आपको कुछ "वास्तविक कोड" शामिल करने होंगे अन्यथा कंपाइलर शाखा को अनुकूलित कर देगा), या प्रणाली में घबराना। मेरे उत्तर C # संकलक द्वारा निर्मित CIL की जांच करने के लिए IL DASM का उपयोग करने पर आधारित हैं । बेशक, यह अंतिम नहीं है, क्योंकि वास्तविक निर्देश CPU रन तब JIT द्वारा बनाए जाते हैं।
मैं वास्तव में मेरी x86 मशीन पर निष्पादित अंतिम सीपीयू निर्देशों की जांच कर चुका हूं, और कुछ ऐसा करते हुए एक साधारण आसन्न सेट स्विच की पुष्टि कर सकता हूं:
jmp ds:300025F0[eax*4]
बाइनरी ट्री खोज कहाँ से भरी है:
cmp ebx, 79Eh
jg 3000352B
cmp ebx, 654h
jg 300032BB
…
cmp ebx, 0F82h
jz 30005EEE