क्या प्रोग्रामिंग में मेमोरी मैनेजमेंट एक अप्रासंगिक चिंता का विषय है?
स्मृति प्रबंधन (या नियंत्रण) वास्तव में C और C ++ का उपयोग करने का प्राथमिक कारण है।
मेमोरी अब तुलनात्मक रूप से सस्ती है।
तेज याददाश्त नहीं। हम अभी भी बहुत कम संख्या में रजिस्टरों को देख रहे हैं, जैसे I1 पर L1 के लिए 32KB डेटा कैश, L2 के लिए 256KB और L3 / कोर के लिए 2MB। ने कहा कि:
यदि हम कार्यशील मेमोरी (यानी एम्बेडेड सिस्टम और इसी तरह) पर सख्त सीमा वाले लक्ष्य प्लेटफार्मों के संदर्भ में नहीं बोलते हैं, तो क्या आज सामान्य प्रयोजन की भाषा चुनने पर मेमोरी का उपयोग एक चिंता का विषय होना चाहिए?
एक सामान्य स्तर पर मेमोरी का उपयोग, शायद नहीं। मैं थोड़ा अव्यवहारिक हूं कि मुझे नोटपैड का विचार पसंद नहीं है, जो कहता है, 50 मेगाबाइट का DRAM और सैकड़ों मेगाबाइट का हार्ड डिस्क स्पेस, भले ही मेरे पास अतिरिक्त और प्रचुर मात्रा में हो। मैं एक लंबे समय के लिए चारों ओर रहा हूँ और यह अजीब लगता है और मुझे इस तरह के एक साधारण आवेदन को देखने के लिए icky की तरह लगता है कि किलोबाइट्स के साथ क्या करने योग्य होना चाहिए, इसके लिए अपेक्षाकृत इतनी स्मृति है। अगर मैं अभी भी अच्छा और उत्तरदायी होता, तो मैं अपने आप के साथ रह पाता।
मेरे क्षेत्र में स्मृति प्रबंधन मेरे लिए महत्वपूर्ण है क्योंकि सामान्य रूप से स्मृति उपयोग को कम नहीं करना है। स्मृति उपयोग के सैकड़ों मेगाबाइट जरूरी नहीं कि किसी भी गैर-तुच्छ तरीके से किसी एप्लिकेशन को धीमा कर दें यदि कोई भी मेमोरी अक्सर एक्सेस नहीं की जाती है (उदाहरण के लिए: केवल एक बटन पर क्लिक करने पर या उपयोगकर्ता इनपुट के किसी अन्य रूप में, जो तब तक बेहद अपरिहार्य है कोरियाई स्टारक्राफ्ट खिलाड़ियों के बारे में बात कर रहे हैं जो एक बटन को एक लाख बार क्लिक कर सकते हैं)।
मेरे क्षेत्र में महत्वपूर्ण कारण यह है कि उन महत्वपूर्ण रास्तों में मेमोरी को कसकर बंद करना और एक साथ बंद करना जो बहुत बार एक्सेस किया जाता है (उदा: हर एक फ्रेम पर लूप किया जा रहा है)। हम चाहते हैं कि हर बार एक कैश मिस न हो, हम एक लाख तत्वों में से केवल एक का उपयोग करते हैं, जिसे हर एक फ्रेम में लूप में एक्सेस करने की आवश्यकता होती है। जब हम स्मृति को धीमी गति से बड़ी मात्रा में तेज मेमोरी से नीचे ले जाते हैं, तो 64 बाइट कैश लाइनें कहती हैं, यह वास्तव में उपयोगी है यदि उन 64 बाइट्स में सभी प्रासंगिक डेटा हों, यदि हम उन 64 बाइट्स में डेटा के कई तत्वों को फिट कर सकते हैं, और यदि हमारे एक्सेस पैटर्न ऐसे हैं जो डेटा के बेदखल होने से पहले हम इसका इस्तेमाल करते हैं।
लाख तत्वों के लिए अक्सर उपयोग किया जाने वाला डेटा केवल 20 मेगाबाइट हो सकता है, भले ही हमारे पास गीगाबाइट हो। यह अभी भी उस डेटा पर लूपिंग फ्रेम दर में अंतर की एक दुनिया बना देता है, यदि मेमोरी कसी हुई है और कैश मिस को कम करने के लिए एक साथ खींचा गया है, और यही वह जगह है जहाँ मेमोरी प्रबंधन / नियंत्रण इतना उपयोगी है। कुछ मिलियन वर्टिकल के साथ एक गोले पर सरल दृश्य उदाहरण:
उपरोक्त वास्तव में मेरे परिवर्तनशील संस्करण की तुलना में धीमा है क्योंकि यह एक जाल की लगातार डेटा संरचना प्रतिनिधित्व का परीक्षण कर रहा है, लेकिन इसके साथ ही, मैं आधे पर भी ऐसे फ्रेम दर को प्राप्त करने के लिए संघर्ष करता था कि डेटा (बेशक हार्डवेयर मेरे संघर्षों के बाद तेजी से बढ़ गया है ) क्योंकि मुझे कैश मिसेज को कम करने और मेष डेटा के लिए मेमोरी का उपयोग करने की फांसी नहीं मिली। मेष इस संबंध में सबसे मुश्किल डेटा संरचनाओं में से कुछ हैं, क्योंकि वे इस तरह के अन्योन्याश्रित डेटा को स्टोर करते हैं, जिन्हें पॉलीगॉन, किनारों, कोने जैसे सिंक में रहना पड़ता है, जैसे कई बनावट नक्शे उपयोगकर्ता संलग्न करना चाहते हैं, बोन वेट। रंग नक्शे, चयन सेट, मॉर्फ लक्ष्य, किनारे भार, बहुभुज सामग्री, आदि आदि।
मैंने पिछले कुछ दशकों में कई मेष प्रणालियों को डिजाइन और कार्यान्वित किया है और उनकी गति अक्सर उनके मेमोरी उपयोग के लिए बहुत आनुपातिक होती है। भले ही मैं इसके साथ काम कर रहा हूं, लेकिन जब मैंने शुरू किया था तब से बहुत अधिक मेमोरी, मेरी नई मेष प्रणाली मेरे पहले डिजाइन (लगभग 20 साल पहले) और एक बड़ी डिग्री की तुलना में 10 गुना तेज है क्योंकि वे लगभग 1/10 वीं का उपयोग करते हैं यादाश्त। नवीनतम संस्करण भी संभव के रूप में ज्यादा डेटा के लिए रटना करने के लिए अनुक्रमित संपीड़न का उपयोग करता है, और अपघटन के प्रसंस्करण उपरि के बावजूद, संपीड़न वास्तव में प्रदर्शन में सुधार हुआ है, क्योंकि, फिर से, हमारे पास इतनी कम कीमती तेज स्मृति है। मैं अब बनावट निर्देशांक, बढ़त बढ़ाने, सामग्री असाइनमेंट आदि के साथ एक लाख बहुभुज जाल फिट कर सकता हूं, इसके साथ लगभग 30 मेगाबाइट में एक स्थानिक सूचकांक भी।
यहाँ 8 मिलियन से अधिक चतुर्भुज और एक मल्टीफ़ायर सबडिवीज़न स्कीम पर i3 पर GF 8400 के साथ (यह कुछ साल पहले से था) के साथ परस्पर उपयोग करने योग्य प्रोटोटाइप है। यह मेरे अपरिवर्तनीय संस्करण की तुलना में तेज़ है, लेकिन उत्पादन में इसका उपयोग नहीं किया गया है क्योंकि मैंने अपरिवर्तनीय संस्करण को बनाए रखने के लिए बहुत आसान पाया है और प्रदर्शन हिट बहुत बुरा नहीं है। ध्यान दें कि वायरफ्रेम पहलुओं को इंगित नहीं करता है, लेकिन पैच (तार वास्तव में घटता है, अन्यथा पूरे जाल ठोस काले होंगे), हालांकि एक पहलू में सभी बिंदु ब्रश द्वारा संशोधित होते हैं।
तो वैसे भी, मैं बस कुछ ठोस उदाहरण और क्षेत्रों को दिखाने के लिए उपरोक्त में से कुछ को दिखाना चाहता था जहां स्मृति प्रबंधन इतना उपयोगी है और उम्मीद भी है कि लोगों को नहीं लगता कि मैं सिर्फ अपने बट से बात कर रहा हूं। जब लोग कहते हैं कि स्मृति इतनी प्रचुर और सस्ती है, तो मैं थोड़ा चिढ़ जाता हूं, क्योंकि यह DRAM और हार्ड ड्राइव जैसी धीमी मेमोरी के बारे में बात कर रहा है। जब हम तेज़ मेमोरी के बारे में बात कर रहे हों, तब भी यह इतना छोटा और इतना कीमती हो, और वास्तव में महत्वपूर्ण (यानी, सामान्य मामला, हर चीज़ के लिए नहीं) पथ का प्रदर्शन उस छोटी मात्रा में तेज़ मेमोरी से खेलने और इसे प्रभावी रूप से उपयोग करने से संबंधित हो, जैसा कि हम कर सकते हैं ।
इस तरह की चीज़ के लिए यह एक ऐसी भाषा के साथ काम करने के लिए वास्तव में सहायक है जो आपको उच्च स्तरीय वस्तुओं को डिज़ाइन करने की अनुमति देती है जैसे कि C ++, उदाहरण के लिए, जबकि अभी भी इन वस्तुओं को एक या एक से अधिक सन्निहित सरणियों में इस गारंटी के साथ संग्रहीत करने में सक्षम है कि स्मृति ऐसी सभी वस्तुओं का सन्दर्भ में प्रतिनिधित्व किया जाएगा और बिना किसी अनावश्यक स्मृति के प्रति वस्तु के ऊपर (उदा: सभी वस्तुओं को प्रतिबिंब या आभासी प्रेषण की आवश्यकता नहीं है)। जब आप वास्तव में उन प्रदर्शन-महत्वपूर्ण क्षेत्रों में चले जाते हैं, तो यह वास्तव में उत्पादकता को बढ़ाने के लिए एक मेमोरी बूस्ट पर नियंत्रण, कहते हैं, ऑब्जेक्ट पूल के साथ फ़िडलिंग और ऑब्जेक्ट ओवरहेड, जीसी लागत से बचने के लिए आदिम डेटा प्रकारों का उपयोग करना और मेमोरी को अक्सर एक्सेस करने के लिए उपयोग करना है। एक साथ सन्निहित।
इसलिए स्मृति प्रबंधन / नियंत्रण (या इसकी कमी) वास्तव में मेरे मामले में एक प्रमुख कारण है कि किस भाषा को चुनने के लिए सबसे अधिक उत्पादकता मुझे समस्याओं से निपटने की अनुमति देती है। मैं निश्चित रूप से अपना हिस्सा कोड लिखता हूं जो प्रदर्शन-महत्वपूर्ण नहीं है, और इसके लिए मैं Lua का उपयोग करता हूं जो C से एम्बेड करना बहुत आसान है।