वस्तुओं की घोषणा का प्रदर्शन
मैं किसी तरह के विश्वविद्यालय विजय पर कोडिंग कर रहा था और कुछ देखा, जब मैंने नीचे दिए गए लूप में एक मानचित्र घोषित किया:
for (int i = 0; i < n; i++)
{
map<int, bool> hashMap;
//...
}
इससे अधिक समय लगता है:
map<int, bool> hashMap;
for (int i = 0; i < n; i++)
{
hashMap.clear();
//...
}
इसलिए मैं सोच रहा था कि लूप में किसी ऑब्जेक्ट को घोषित करने से उसका प्रदर्शन फिर से शुरू करने की तुलना में खराब प्रदर्शन क्यों होता है?
जवाब
कोड के पहले संस्करण में कंस्ट्रक्टर और डिस्ट्रक्टर hashMap
हैं जिन्हें n
बार कहा जाता है, जबकि दूसरे संस्करण में उन्हें सिर्फ एक बार कहा जाता है।
स्वाभाविक प्रश्न यह है कि किसी नई map
वस्तु को नष्ट करना और निर्माण करना एक ही वस्तु को अलग-अलग बनाम समाशोधन और पुन: उपयोग करना बिल्कुल अलग होगा। यह निश्चित रूप map
से उपयोग किए जा रहे कार्यान्वयन के वास्तविक कोड का निरीक्षण करके ही उत्तर दिया जा सकता है, इसलिए निम्नलिखित केवल एक प्रशंसनीय अनुमान है।
std::mapआमतौर पर लाल-काले पेड़ों का उपयोग करके लागू किया जाता है , और यह लाल-काले पेड़ के कार्यान्वयन के लिए आम है, जो कि NIL- पत्तियों के लिए एक प्रहरी नोड का उपयोग करता है , उदाहरण के लिए एक लाल काले पेड़ में एक संतरी नोड का लाभ देखें ? । इस प्रहरी को हर बार एक पेड़ के निर्माण के लिए आवंटित किया जाना चाहिए, फिर विनाश पर जारी किया गया। इसके विपरीत, clear
'आईएनजी map
, इसके बजाय, पेड़ को खाली करता है लेकिन संबंधित आंतरिक वस्तुओं का पुन: उपयोग करता है।
इस तरह के कार्यान्वयन के वास्तविक जीवन के उदाहरण के लिए, माइक्रोसॉफ्ट के _Treeनिर्माता ने उपयुक्त नाम दिया _Alloc_sentinel_and_proxy();
। चूंकि उनके map
व्युत्पन्न होते हैं _Tree
, इसलिए इसे हर बार एक map
ऑब्जेक्ट का निर्माण कहा जाता है।