मैंने विशिष्ट भाषाओं के लिए यहां जवाब देखा है, किसी भी मामले के लिए लगातार पहुंच समय की गारंटी के लिए 5 से अधिक मामलों को स्विच टेबल के साथ अनुकूलित किया जा रहा है।
क्या ऐसा सी/सी ++ के लिए है?
क्या यह विशेष रूप से जीसीसी के लिए है? दृश्य स्टूडियो के लिए?
यदि नहीं, तो घटना आवृत्ति सहायता के क्रम में मामलों को सॉर्ट करना होगा?कई मामलों के लिए स्विच अनुकूलन किसी भी मामले के लिए समान पहुंच समय की गारंटी देता है? (सी ++)
उत्तर
मानक स्विच स्टेटमेंट को लागू करने के तरीके के बारे में कुछ भी गारंटी नहीं देता है। मैंने एक कंपाइलर को हैश टेबल का उत्पादन कभी नहीं देखा है, हालांकि कुछ लोग एक जंप टेबल का उत्पादन करेंगे। जब तक मेरी याददाश्त सामान्य से भी बदतर काम नहीं कर रही है, तब तक वीएस और जीसीसी दोनों जंप टेबल उत्पन्न कर सकते हैं जब मामले पर्याप्त रूप से घने होते हैं ("पर्याप्त रूप से" के विभिन्न मूल्यों के लिए)। दुर्भाग्यवश, घटना की आवृत्ति द्वारा क्रमबद्ध होने पर यह कहना लगभग असंभव है (या जरूरी रूप से भी पता लगाना) - यह न केवल कंपाइलरों के बीच अलग है, बल्कि एक ही कंपाइलर के विभिन्न संस्करणों के बीच भी अलग है।
यह आपके लिए संकलक करेगा। जीसीसी के मामले में यह एक जंप टेबल का उपयोग करेगा।
- सी और सी ++ स्विच स्टेटमेंट के चलने वाले समय के बारे में कुछ भी गारंटी नहीं देता है।
- मुझे डर है कि मुझे किसी भी कंपाइलर के लिए कार्यान्वयन विवरण नहीं पता है। यह शायद अनुकूलन झंडे पर निर्भर करता है।
- छंटाई मामलों में मदद करने की गारंटी है नहीं, तो फिर यह मानक द्वारा निर्दिष्ट नहीं है, और अपने कार्यान्वयन या नहीं हो सकता हो सकता है:
- संकलक विकल्पों के अनुसार अलग अलग बातें करते हैं
- दस्तावेज़ क्या यह
- करता है भविष्य में संस्करणों में जो कुछ भी करता है उसे बदलने की गारंटी
- स्रोत में मामलों के क्रम को पूरी तरह से अनदेखा करें, और उन्हें फिर से ऑर्डर करें। निश्चित रूप से मानते हैं कि मामले "स्वतंत्र" हैं: कोई गिरावट नहीं; एक मामले में शुरू होने और किसी अन्य मामले में फैले कोई परिवर्तनीय घोषणा नहीं; मैं और कुछ नहीं भूल गया हूँ।
ग (और विस्तार C++ द्वारा) केवल पूर्णांक प्रकार पर स्विच, इसलिए हैशिंग आवश्यक नहीं है। कंपाइलर आमतौर पर उस आर्किटेक्चर के लिए उपयुक्त मुहावरे का उपयोग करेगा जिसे आप संकलित कर रहे हैं। इसे अनुक्रमणित किया जा सकता है (अगर एक छोटी सी रेंज का उपयोग किया जाता है), कूद तालिकाओं, या कुछ पूरी तरह से अलग।
हैशिंग आवश्यक नहीं है, लेकिन कभी-कभी एक जंप टेबल में इंडेक्स के रूप में एक पूर्ण हैश का उपयोग करके पूर्णांक मामलों का एक समूह अनुकूलित करना संभव है - मूल रूप से निरंतर संख्याओं का एक सेट लेना और एक बाइनरी निर्णय पेड़ को पार करने से आप उन्हें लगातार एक स्थान पर तेजी से मानचित्रित कर सकते हैं। चाहे वह अनुकूलन हो, किसी भी कंपाइलर-लेखक को परेशान किया जा सकता है ... –
@ स्टेव: मैं इसके लिए अपना शब्द ले जाऊंगा, लेकिन आर्किटेक्चर पर जिन्हें मैंने टिप्पणी करने के लिए पर्याप्त असेंबली के बारे में जाना है (ज्यादातर सुंदर दिन) एक कूद तालिका समान रूप से तेज होगी। एक बड़ी पूर्णांक सीमा पर स्पैस लक्ष्यों को प्रबंधित करने के लिए यहां तक कि दो स्तर की कूद तालिका भी। – dmckee
एक अपवाद जो मैं छवि कर सकता हूं बाइनरी झंडे के सेट के लिए एक आदर्श हैश होगा। अर्थात। यदि सभी "केस वैल्यू" 2 शक्तियों की शक्तियां हैं। – MSalters
जीसीसी के कार्यान्वयन के लिए देखें:
http://old.nabble.com/optimization-of-switch-statements-on-i386-to15366926.html#a15367662
एक हैश, एक स्विच को लागू करने के लिए एक कुशल तरीके की तरह प्रतीत नहीं होता है क्योंकि आप देखने की वजह से अतिरिक्त कैश छूट जाए होगा।
- 1. सी ++ 11 मानक गारंटी के समान बीज के लिए समान यादृच्छिक संख्या गारंटी देता है?
- 2. सी # स्विच: मामले अन्य मामलों के लिए के माध्यम से नहीं गिरने सीमा के
- 3. किसी मामले/स्विच स्टेटमेंट के लिए पाइथन समकक्ष क्या है?
- 4. कई मामलों के साथ जावा स्विच स्टेटमेंट अनुकूलित करना?
- 5. क्या लूप के लिए सी ++ 11 नए या बेहतर अनुकूलन की अनुमति देता है?
- 6. उपयोग मामलों के लिए अभिनेताओं की पहचान
- 7. गिरावट के साथ मामले स्विच करें?
- 8. सी: तार्किक ऑपरेटर के साथ स्विच मामले
- 9. स्टेटिक प्रारंभिक सिंगलटन थ्रेड सुरक्षा की गारंटी देता है? (सी #)
- 10. स्विच एक स्विच/मामले
- 11. मामलों के आदेश पीएचपी स्विच बयान में कोई फर्क है?
- 12. क्या readdir() ऑर्डर की गारंटी देता है?
- 13. किसी अनुभवी सी ++ डेवलपर के लिए जावा पर रैपिड स्विच
- 14. क्या Dir.glob आदेश की गारंटी देता है?
- 15. किसी भी अनुकूलन के बिना सी प्रोग्राम को संकलित करने के लिए कैसे करें
- 16. क्या एक Django ModelField है जो कई विकल्पों के लिए कई विकल्पों की अनुमति देता है?
- 17. सी # 3 किसी भी एनम के लिए शाब्दिक शून्य (0) के अंतर्निहित रूपांतरण की अनुमति क्यों देता है?
- 18. jQuery.attr() लोअरकेस की गारंटी देता है?
- 19. जीएचसी के मामलों में पहचान के मामले क्या होते हैं?
- 20. क्या नया चार वास्तव में कक्षा के प्रकार के लिए गठबंधन स्मृति की गारंटी देता है?
- 21. एक कक्षा को परिभाषित करने के लिए जो हास्केल में विभिन्न अभिलेखों तक समान पहुंच की अनुमति देता है?
- 22. टाइप करता है। GetProperties() PropertyInfo [] परिणाम के लिए एक निश्चित आदेश की गारंटी देता है?
- 23. हर किसी के लिए समान चर?
- 24. क्या सी # में फोरैच लूप मूल्यांकन के आदेश की गारंटी देता है?
- 25. सी # विभिन्न मामलों के साथ तारों की तुलना
- 26. पर्सफोर्स के लिए गिट-एसवीएन के समान कुछ भी?
- 27. सी स्विच-केस घुंघराले ब्रेसिज़ हर मामले
- 28. PostgreSQL के लिए MySQL प्रॉक्सी के समान कुछ भी?
- 29. Enums, स्विच मामले
- 30. मैच "गिरावट": एक से अधिक मामलों के लिए कोड के समान टुकड़े को निष्पादित करना?
ऐसा लगता है कि यह सी को "गो किलर" बना देगा यदि वे स्विच स्टेटमेंट को अनुकूलित कर सकते हैं ... –
अगर मैं 6 मामलों के लिए हैशिंग तेज था तो मुझे आश्चर्य होगा। शायद 25 के लिए। निश्चित रूप से, एक हैश तालिका संभवतः एक्सेस समय में भिन्नता को कम कर देगी, लेकिन यह एक निश्चित ओवरहेड जोड़कर ऐसा करता है। – MSalters
मुझे यकीन है कि आप समझते हैं कि यह केवल तभी महत्वपूर्ण है जब स्विच शाखाएं वास्तव में बहुत कुछ नहीं करती हैं, और यदि पीसी वास्तव में स्विच में 10% या उससे अधिक समय का एक महत्वपूर्ण अंश है। अन्यथा यह मूल रूप से क्वांटम शोर है। –