2010-02-12 14 views
7

यदि कोई सरणी वर्ग को सामान्य रूप से कार्यान्वित करने के तरीके को लागू करता है, तो इसका प्रदर्शन एक एसक्टर के समान एसटीएल की तुलना में धीमी है। तो एसटीएल कंटेनर/एल्गोरिदम तेजी से क्या बनाता है?एसटीएल तेजी से क्या बनाता है?

+9

"जिस तरह से इसे सामान्य रूप से कार्यान्वित किया जाता है" एक बहुत ही अस्पष्ट चीज है। हर कोई इसे अपने तरीके से लागू करता है।तकनीकी रूप से, यह आमतौर पर * कार्यान्वित नहीं किया जाता है * लेकिन पुन: उपयोग किया जाता है। –

+1

कृपया निर्दिष्ट करें कि आप कौन से परिचालनों का संदर्भ लेते हैं, और आपने यह निर्धारित किया कि मानक लाइब्रेरी तेज़ है। –

+0

@ मेहरदाद, मालटे: हाँ, मैं सहमत हूं। लेकिन आइए एक सरणी वर्ग के लिए कहें, तत्वों को स्थानांतरित करके मध्य में एक तत्व डालने के बाद नए तत्व के लिए रिक्त स्थान बनाने के लिए। यह कार्यान्वयन वेक्टर के push_back() से बहुत धीमा है। मैं समय या घड़ी चक्र प्राप्त करके इसे निर्धारित करता हूं। – jasonline

उत्तर

10

for_each जैसे एसटीएल एल्गोरिदम फ़ंक्शन ऑब्जेक्ट्स को आसानी से रेखांकित किया जा सकता है। दूसरी ओर, सी फ़ंक्शन पॉइंटर्स का उपयोग करता है जो संकलक को ऑप्टिमाइज़ करने के लिए अधिक कठिन होते हैं।

यह कुछ एल्गोरिदम में एक बड़ा अंतर बनाता है जैसे सॉर्टिंग जिसमें तुलनात्मक फ़ंक्शन को कई बार बुलाया जाना चाहिए।

विकिपीडिया में आपकी रुचि होने पर some more information है।

संपादित करें:

एसटीएल के वेक्टर वर्ग का सवाल है, तो मुझे वह नहीं है कि क्या आप में मिल सकता है, कहते हैं, glibc जरूरी तेज है लगता है।

+0

शायद क्रूक्स अंक में से एक है: डी –

+0

दिलचस्प ... – toto

1

मानक लाइब्रेरी अच्छी एल्गोरिदम का उपयोग करती है, जैसे सरणी (std :: वेक्टर) के मामले में यह आमतौर पर अंतरिक्ष से बाहर होने पर स्टोरेज को दोगुना करता है, जबकि एक भयानक कार्यान्वयन हर बार एक तत्व द्वारा भंडारण में वृद्धि कर सकता है। चूंकि भंडारण की मात्रा में वृद्धि बहुत धीमी है (सभी मौजूदा डेटा को पुराने आवंटन से नए आवंटन में कॉपी करने की आवश्यकता है), इससे बड़ा अंतर हो सकता है।

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

मैंने जो कहा वह सी ++ मानक द्वारा निर्दिष्ट नहीं है, लेकिन मौजूदा कार्यान्वयन में सामान्य प्रथा क्या है।

+0

मेगाबाइट तक पहुंचने के बाद स्टोरेज डबल वास्तव में खराब हो सकता है .... –

+0

हसन सैयद: आप आवंटित स्मृति की 50% से अधिक बर्बाद नहीं करते हैं। मैं उसे "काफी बुरा" नहीं कहूंगा। –

+1

स्पष्ट रूप से std :: वेक्टर 1.5: http://amitp.blogspot.com/2003_11_01_amitp_archive.html#106843046050898865 – Manuel

1

एसटीएल में एल्गोरिदम का अध्ययन गणितज्ञों और कंप्यूटर वैज्ञानिकों के सभी स्तरों से वर्षों से किया गया है, और वे आम तौर पर पूर्णत: सबसे कुशल एल्गोरिदम का उपयोग करते हैं, जो आपके कार्यान्वयन का उपयोग नहीं कर रहे हैं। आम कार्यान्वयन वह है जो शायद सबसे तेज़ नहीं है, लेकिन समझना सबसे आसान है; एसटीएल शायद अधिक अनुकूलित कार्यान्वयन का उपयोग कर रहा है।

+1

जब सभी प्रकार के अत्यधिक शिक्षित लोगों ने कुछ आशीर्वाद दिया है (यदि उनके पास है) तो यह नहीं मानते कि आपको इसके बारे में सोचने की आवश्यकता नहीं है। वे काफी गलत हैं और गलत होने के योग्य हैं। –

+0

-1: मैं कहूंगा कि यह बिल्कुल सही कथन नहीं है। "एल्गोरिदम" कार्यान्वयन विशिष्ट हैं। केवल एसटीएल एल्गोरिदम/कंटेनर, आदि का खुलासा व्यवहार निर्दिष्ट है। एसटीएल के कई सारे कार्यान्वयन हैं और जिनकी आप दावा करते हैं, उनके पास कहीं भी जांच नहीं की गई है (वास्तव में, मैं सबसे ज्यादा नहीं कहूंगा)। औसत कोडर लिखने से कई कार्यान्वयन बेहतर होते हैं, लेकिन एक अच्छा कोडर आसानी से उनके साथ प्रतिस्पर्धा कर सकता है ... –

5

अधिकांश लोगों की सरणी कक्षाएं निरंतर कारक (मानक पुस्तकालय की आवश्यकता के अनुसार) की बजाय निरंतर वृद्धि के आकार को बढ़ाती हैं। इसका मतलब है कि एक तत्व डालने से मानक लाइब्रेरी के लिए आवंटित निरंतर समय की बजाय मोटे तौर पर रैखिक समय लगता है।

+2

कोई डेवलपर ऐसा कर रहा है जो उसे कंप्यूटर विज्ञान की डिग्री वापस देनी चाहिए –

+4

@DrJokepu: आप मानते हैं कि डेवलपर कंप्यूटर विज्ञान की डिग्री है:) +1 –

0

कोड एक कंपाइलर-अनुकूल तरीके से लिखा गया है, उदा। इनलाइनिंग, आदि

बेशक, वे जो एल्गोरिदम उपयोग करते हैं वे अत्याधुनिक हैं।

0

अच्छे, सामान्य एल्गोरिदम के अलावा (जैसा कि अन्य ने नोट किया है), एसटीएल टेम्पलेट्स के भारी उपयोग के कारण भी काफी कुशल है।

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

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