2010-01-25 9 views
8

मैंने विशिष्ट भाषाओं के लिए यहां जवाब देखा है, किसी भी मामले के लिए लगातार पहुंच समय की गारंटी के लिए 5 से अधिक मामलों को स्विच टेबल के साथ अनुकूलित किया जा रहा है।
क्या ऐसा सी/सी ++ के लिए है?
क्या यह विशेष रूप से जीसीसी के लिए है? दृश्य स्टूडियो के लिए?
यदि नहीं, तो घटना आवृत्ति सहायता के क्रम में मामलों को सॉर्ट करना होगा?कई मामलों के लिए स्विच अनुकूलन किसी भी मामले के लिए समान पहुंच समय की गारंटी देता है? (सी ++)

+0

ऐसा लगता है कि यह सी को "गो किलर" बना देगा यदि वे स्विच स्टेटमेंट को अनुकूलित कर सकते हैं ... –

+1

अगर मैं 6 मामलों के लिए हैशिंग तेज था तो मुझे आश्चर्य होगा। शायद 25 के लिए। निश्चित रूप से, एक हैश तालिका संभवतः एक्सेस समय में भिन्नता को कम कर देगी, लेकिन यह एक निश्चित ओवरहेड जोड़कर ऐसा करता है। – MSalters

+0

मुझे यकीन है कि आप समझते हैं कि यह केवल तभी महत्वपूर्ण है जब स्विच शाखाएं वास्तव में बहुत कुछ नहीं करती हैं, और यदि पीसी वास्तव में स्विच में 10% या उससे अधिक समय का एक महत्वपूर्ण अंश है। अन्यथा यह मूल रूप से क्वांटम शोर है। –

उत्तर

11

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

+0

क्षमा करें, मेरा मतलब जंप टेबल था। – Petruza

+0

@Pretruza: आप अपने मूल पोस्ट को ठीक कर सकते हैं – peterchen

0

यह आपके लिए संकलक करेगा। जीसीसी के मामले में यह एक जंप टेबल का उपयोग करेगा।

2
  • सी और सी ++ स्विच स्टेटमेंट के चलने वाले समय के बारे में कुछ भी गारंटी नहीं देता है।
  • मुझे डर है कि मुझे किसी भी कंपाइलर के लिए कार्यान्वयन विवरण नहीं पता है। यह शायद अनुकूलन झंडे पर निर्भर करता है।
  • छंटाई मामलों में मदद करने की गारंटी है नहीं, तो फिर यह मानक द्वारा निर्दिष्ट नहीं है, और अपने कार्यान्वयन या नहीं हो सकता हो सकता है:
    • संकलक विकल्पों के अनुसार अलग अलग बातें करते हैं
    • दस्तावेज़ क्या यह
    • करता है भविष्य में संस्करणों में जो कुछ भी करता है उसे बदलने की गारंटी
    • स्रोत में मामलों के क्रम को पूरी तरह से अनदेखा करें, और उन्हें फिर से ऑर्डर करें। निश्चित रूप से मानते हैं कि मामले "स्वतंत्र" हैं: कोई गिरावट नहीं; एक मामले में शुरू होने और किसी अन्य मामले में फैले कोई परिवर्तनीय घोषणा नहीं; मैं और कुछ नहीं भूल गया हूँ।
1

ग (और विस्तार C++ द्वारा) केवल पूर्णांक प्रकार पर स्विच, इसलिए हैशिंग आवश्यक नहीं है। कंपाइलर आमतौर पर उस आर्किटेक्चर के लिए उपयुक्त मुहावरे का उपयोग करेगा जिसे आप संकलित कर रहे हैं। इसे अनुक्रमणित किया जा सकता है (अगर एक छोटी सी रेंज का उपयोग किया जाता है), कूद तालिकाओं, या कुछ पूरी तरह से अलग।

+2

हैशिंग आवश्यक नहीं है, लेकिन कभी-कभी एक जंप टेबल में इंडेक्स के रूप में एक पूर्ण हैश का उपयोग करके पूर्णांक मामलों का एक समूह अनुकूलित करना संभव है - मूल रूप से निरंतर संख्याओं का एक सेट लेना और एक बाइनरी निर्णय पेड़ को पार करने से आप उन्हें लगातार एक स्थान पर तेजी से मानचित्रित कर सकते हैं। चाहे वह अनुकूलन हो, किसी भी कंपाइलर-लेखक को परेशान किया जा सकता है ... –

+0

@ स्टेव: मैं इसके लिए अपना शब्द ले जाऊंगा, लेकिन आर्किटेक्चर पर जिन्हें मैंने टिप्पणी करने के लिए पर्याप्त असेंबली के बारे में जाना है (ज्यादातर सुंदर दिन) एक कूद तालिका समान रूप से तेज होगी। एक बड़ी पूर्णांक सीमा पर स्पैस लक्ष्यों को प्रबंधित करने के लिए यहां तक ​​कि दो स्तर की कूद तालिका भी। – dmckee

+0

एक अपवाद जो मैं छवि कर सकता हूं बाइनरी झंडे के सेट के लिए एक आदर्श हैश होगा। अर्थात। यदि सभी "केस वैल्यू" 2 शक्तियों की शक्तियां हैं। – MSalters

0

एक हैश, एक स्विच को लागू करने के लिए एक कुशल तरीके की तरह प्रतीत नहीं होता है क्योंकि आप देखने की वजह से अतिरिक्त कैश छूट जाए होगा।

संबंधित मुद्दे