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