2013-06-25 10 views
5

मैं निम्नलिखित है:बढ़ावा :: वैकल्पिक दक्षता क्या है?

class Obj; 
typedef std::map<string, string> StrMap; 
std::map<std::string, std::pair<Obj, StrMap> > complexMap; 

बात यह है कि complexMap में कुछ प्रविष्टियों के लिए StrMap खाली हो जाएगा और मैं इसे बिल्कुल भी उपयोग नहीं होगा, इसलिए दक्षता के लिए मैं :: बढ़ावा उपयोग करने के लिए विचार कर रहा हूँ वैकल्पिक। मेरा सवाल है कि बूस्ट :: वैकल्पिक की दक्षता क्या है, मुझे डर है कि इसकी कीमत चुकाकर मुझे अंत में कुछ भी नहीं मिलेगा।

+4

क्या आपने अपना कोड प्रोफाइल किया है और यह पहचाना है कि निर्माण के कारण प्रदर्शन की बाधा है खाली नक्शे? –

+1

@LucTouraille, नहीं। मैं सिर्फ उच्चतम प्रदर्शन प्राप्त करना चाहता हूं जो मैं प्राप्त कर सकता हूं। – Subway

+1

आप किस विकल्प पर विचार कर रहे हैं? "उच्चतम प्रदर्शन" ढूंढने का तरीका विभिन्न समाधानों को प्रोफाइल करना और उच्च प्रदर्शन के साथ एक को चुनना है। – juanchopanza

उत्तर

5

optional की Think। आपका नक्शा पहले से ही एक कंटेनर है जो एन तत्वों को 0 पकड़ सकता है। एक वैकल्पिक नक्शा इसलिए एक कंटेनर-इन-ए-कंटेनर है जो एन तत्वों को 0 तक रख सकता है। वास्तव में, यहां कोई फायदा नहीं है।

खाली मानचित्र का ऊपरी भाग काफी छोटा है। मानचित्र वास्तव में मानचित्र नोड्स, आंतरिक रूप से, और एक खाली मानचित्र से बनाए गए हैं, जिनमें कोई नोड नहीं है।(ऐसा नहीं हो सकता है, क्योंकि प्रत्येक नोड में कोई मान होता है, और कोई रास्ता नहीं है जिसके द्वारा एक खाली नक्शा डिफ़ॉल्ट मान बना सकता है)

+0

सरल और स्पष्ट। धन्यवाद! – Subway

2

आप एक "विरल" गणना कर रहे हैं, तो आप दो बातें कर सकते हैं:

  1. एक बड़ी complexMap युक्त रखना एक boost::optional साथ गैर-मौजूद परिणामों का एक बहुत। यह प्रति-तत्व आधार पर sparseness encapsulates encapsulates।
  2. संकेत की एक अतिरिक्त परत (unordered_map उदा।) बनाएं जिसमें आपके complexmMap में मौजूदा तत्वों के पॉइंटर्स शामिल हैं। यह प्रति मानचित्र आधार पर sparseness encapsulates encapsulates।

वैकल्पिक 1 प्रोग्रामर के रूप में आपके लिए अधिक सुविधाजनक होगा, अंतरिक्ष ओवरहेड की कीमत पर थोड़ी सी आवश्यकता होगी। वैकल्पिक 2 लगभग पूरी तरह से अंतरिक्ष-कुशल होगा और जितना संभव हो सके complexMap रखें, लेकिन अधिक प्रोग्रामिंग कार्य को आगे की आवश्यकता होगी।

चुनें जो भी विकल्प आपको अधिक स्वीकार्य है (संकेत: यदि आप complexMap में गीगाबाइट स्तर की गणना कर रहे हैं, तो शायद अतिरिक्त स्तर का संकेत मिलता है, अन्यथा मैं परेशान नहीं होता)।

स्पेस ओवरहेड के अलावा, boost::optional पर थोड़ी सी लागत नहीं है, क्योंकि इसे डिफ़ॉल्ट कन्स्ट्रक्टर या गतिशील स्मृति आवंटन की आवश्यकता नहीं है।

2

एक जवाब के लिए टिप्पणी जा रहा है ...

कैसे वैकल्पिक कार्यान्वित किया जाता है के बारे में सोचो, यह आम तौर पर कुछ आंतरिक भंडारण है (यह नक्शा पकड़ वस्तु के लिए अनुमति देने के लिए - के रूप में आप ऊपर अपने कोड में होगा) , और केवल अंतर यह है कि यह उस भंडारण में मानचित्र का निर्माण नहीं करता है - यह बाद में छोड़ा गया है। हालांकि वैकल्पिक वस्तु का निर्माण किया जाना है। तो अब सिर्फ नक्शा बनाने के बजाय, आप उस मामले में एक बड़ा वैकल्पिक ऑब्जेक्ट बना रहे हैं जहां आप मानचित्र का उपयोग नहीं कर रहे हैं, और जब आप मानचित्र का उपयोग करते हैं, तो आपको उसे भी बनाना होगा। ऐसा लगता है कि आप थोड़ा लाभ के लिए और अधिक चीजें कर रहे हैं।

ऐसे मामले हैं जहां optional समझ में आता है (उदाहरण के लिए वापसी मान, जहां आप उदाहरण के लिए एक अमान्य स्थिति इंगित करना चाहते हैं, या आपके पास बहुत महंगा कंस्ट्रक्टर है जो जटिल सदस्यों के प्रारंभिक कार्य करता है), तुच्छ के साथ वस्तुओं के लिए कन्स्ट्रक्टर, वैकल्पिक वास्तव में कोड अव्यवस्था के लायक नहीं है।

अस्वीकरण: लेकिन सभी प्रदर्शन से संबंधित प्रश्नों, प्रोफाइल, प्रोफाइल और उसके बाद के साथ के रूप में एक कंटेनर कि 0 या 1 मान हो सकते हैं के रूप में फिर से प्रोफ़ाइल ...

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