मुझे पता है कि यह एक पुराना सवाल है, लेकिन ऐसी कई चीजें हैं जो हर कोई गायब होने लगती है। आकार < < 1. यह वह जगह है कुछ भी 1 और 2 के बीच से गुणा: पूर्णांक (नाव (आकार) * x), x संख्या है, * तैर रहा है बिंदु
पहले, इस 2 से गुणा है गणित, और प्रोसेसर को फ्लोट और int के बीच कास्टिंग के लिए अतिरिक्त निर्देश चलाने पड़ते हैं। दूसरे शब्दों में, मशीन स्तर पर, दोगुना नया आकार खोजने के लिए एक एकल, बहुत तेज़ निर्देश लेता है। 1 और 2 के बीच कुछ गुणा करने के लिए कम से कम एक फ्लोट पर आकार कास्ट करने के लिए एक निर्देश, गुणा करने के लिए एक निर्देश (जो फ्लोट गुणा है, इसलिए शायद यह कम से कम दो चक्र लेता है, अगर 4 या 8 गुना नहीं कई), और int को वापस करने के लिए एक निर्देश, और यह मानता है कि आपका प्लेटफार्म सामान्य रजिस्ट्रारों के उपयोग की आवश्यकता के बजाय, सामान्य उद्देश्य रजिस्टरों पर फ्लोट गणित कर सकता है। संक्षेप में, आपको प्रत्येक आवंटन के लिए गणित की अपेक्षा की जानी चाहिए कि एक साधारण बाएं शिफ्ट के रूप में कम से कम 10 गुना लें।यदि आप पुनर्वितरण के दौरान बहुत सारे डेटा की प्रतिलिपि बना रहे हैं, तो इससे कोई फर्क नहीं पड़ता है।
दूसरा, और शायद बड़ा किकर: हर कोई यह मानता है कि जो स्मृति मुक्त हो रही है वह दोनों ही स्वयं के साथ मिलती है, साथ ही नई आवंटित स्मृति के साथ मिलती है। जब तक कि आप सभी स्मृति को पूर्व-आवंटित नहीं कर रहे हैं और फिर इसे पूल के रूप में उपयोग कर रहे हैं, यह लगभग निश्चित रूप से मामला नहीं है। ओएस कभी-कभी ऐसा करने के अंत में हो सकता है, लेकिन ज्यादातर समय, पर्याप्त खाली स्थान विखंडन होने वाला है कि किसी भी आधा सभ्य स्मृति प्रबंधन प्रणाली एक छोटा छेद ढूंढने में सक्षम होगी जहां आपकी याददाश्त ठीक होगी। एक बार जब आप वास्तव में थोड़ा भाग प्राप्त कर लेते हैं, तो आप संगत टुकड़ों के साथ खत्म होने की अधिक संभावना रखते हैं, लेकिन तब तक, आपके आवंटन इतने बड़े होते हैं कि आप अक्सर इसके लिए अक्सर पर्याप्त नहीं कर रहे हैं। संक्षेप में, यह कल्पना करना मजेदार है कि कुछ आदर्श संख्या का उपयोग मुफ्त मेमोरी स्पेस के सबसे कुशल उपयोग की अनुमति देगा, लेकिन असल में, यह तब तक नहीं होने वाला है जब तक कि आपका प्रोग्राम नंगे धातु पर चल रहा न हो (जैसा कि, कोई ओएस नहीं है सभी निर्णयों को बनाने के नीचे)।
प्रश्न का मेरा जवाब? नहीं, कोई आदर्श संख्या नहीं है। यह इतना विशिष्ट है कि कोई भी वास्तव में कोशिश करता है। यदि आपका लक्ष्य आदर्श स्मृति उपयोग है, तो आप भाग्य से बहुत अधिक हैं। प्रदर्शन के लिए, कम आवंटन आवंटन बेहतर होते हैं, लेकिन अगर हम इसके साथ जाते हैं, तो हम 4 या 8 तक गुणा कर सकते हैं! बेशक, जब फ़ायरफ़ॉक्स एक शॉट में 1 जीबी से 8 जीबी का उपयोग करने से कूदता है, तो लोग शिकायत करने जा रहे हैं, इसलिए यह भी समझ में नहीं आता है। अंगूठे के कुछ नियम यहां दिए गए हैं:
यदि आप स्मृति उपयोग को अनुकूलित नहीं कर सकते हैं, कम से कम प्रोसेसर चक्र बर्बाद न करें। 2 से गुणा करना फ्लोटिंग पॉइंट गणित करने से कम से कम परिमाण का क्रम है। यह एक बड़ा अंतर नहीं बना सकता है, लेकिन इससे कम से कम कुछ अंतर आएगा (विशेष रूप से, अधिक बार और छोटे आवंटन के दौरान)।
इसे ओवरथिंक न करें। यदि आपने अभी कुछ ऐसा करने का प्रयास करने के लिए 4 घंटे बिताए हैं जो पहले से ही किया जा चुका है, तो आपने अपना समय बर्बाद कर दिया है। पूरी तरह से ईमानदारी से, यदि * 2 से बेहतर विकल्प था, तो यह दशकों पहले सी ++ वेक्टर वर्ग (और कई अन्य स्थानों) में किया गया होता।
आखिरकार, यदि आप वास्तव में अनुकूलित करना चाहते हैं, तो छोटी चीजें पसीना न करें। अब दिन, कोई भी 4KB स्मृति बर्बाद होने की परवाह नहीं करता है, जब तक कि वे एम्बेडेड सिस्टम पर काम नहीं कर रहे हों। जब आप 1 जीबी ऑब्जेक्ट्स प्राप्त करते हैं जो प्रत्येक 1 एमबी और 10 एमबी के बीच होते हैं, तो दोगुना संभवतः बहुत अधिक होता है (मेरा मतलब है, यह 100 से 1,000 वस्तुओं के बीच है)। यदि आप अपेक्षित विस्तार दर का आकलन कर सकते हैं, तो आप इसे एक निश्चित बिंदु पर रैखिक विकास दर तक ले जा सकते हैं। यदि आप प्रति मिनट लगभग 10 ऑब्जेक्ट्स की अपेक्षा करते हैं, तो प्रति चरण 5 से 10 ऑब्जेक्ट आकारों में बढ़ रहे हैं (एक बार हर 30 सेकंड में एक मिनट में) शायद ठीक है।
यह सब कुछ नीचे आता है, इसे सोचने पर विचार न करें, आप जो कर सकते हैं उसे अनुकूलित करें और अपने आवेदन (और मंच) को अनुकूलित करें यदि आपको चाहिए।
विस्तृत करने के लिए, सरणी आकार को दोगुना करने का अर्थ है कि आपको ** आवंटित ** ओ (1) प्रविष्टियां मिलती हैं। विचार यह है कि हर बार जब आप कोई तत्व डालते हैं, तो आप पुरानी सरणी से तत्व को प्रतिलिपि बनाते हैं। आइए कहें कि आपके पास _m_ तत्वों के साथ आकार _m_ की एक सरणी है। तत्व _m + 1_ जोड़ते समय, कोई स्थान नहीं है, इसलिए आप आकार की एक नई सरणी _2m_ आवंटित करते हैं। सभी पहले _m_ तत्वों की प्रतिलिपि बनाने के बजाय, जब भी आप कोई नया तत्व डालते हैं तो आप प्रतिलिपि बनाते हैं। यह भिन्नता को कम करता है (स्मृति के आवंटन के लिए सहेजें), और एक बार जब आप 2 एम तत्व डालते हैं, तो आप पुराने तत्वों से सभी तत्वों की प्रतिलिपि बना लेंगे। – hvidgaard