मैं सी ++ का उपयोग कर लिखे गए बड़े सर्वर एप्लिकेशन पर काम कर रहा हूं। इस सर्वर को संभवतः महीनों के लिए पुनरारंभ किए बिना चलाने की आवश्यकता है। Fragmentation पहले से ही एक संदिग्ध मुद्दा है, क्योंकि समय के साथ हमारी स्मृति खपत बढ़ जाती है। अब तक वर्चुअल बाइट्स के साथ निजी बाइट्स की तुलना करने के लिए माप किया गया है, और उन दो संख्याओं में अंतर का विश्लेषण किया गया है।कोड कोड करते समय स्मृति विखंडन की सोच: समयपूर्व अनुकूलन या नहीं?
विखंडन के लिए मेरा सामान्य दृष्टिकोण इसे विश्लेषण में छोड़ना है। मेरे पास सामान्य प्रदर्शन और स्मृति अनुकूलन जैसी अन्य चीज़ों के बारे में सोचने का एक ही तरीका है। आपको विश्लेषण और प्रमाण के साथ परिवर्तनों का बैक अप लेना होगा।
मैं कोड समीक्षा या चर्चाओं के दौरान बहुत कुछ देख रहा हूं, कि स्मृति विखंडन पहली चीजों में से एक है। ऐसा लगता है कि अब इसके बारे में बहुत बड़ा डर है, और समय से पहले "विखंडन को रोकने" की एक बड़ी पहल है। कोड परिवर्तनों का अनुरोध किया जाता है जो स्मृति विखंडन समस्याओं को कम करने या रोकने के लिए अनुकूल लगते हैं। मैं बल्ले से इन अधिकारों से असहमत हूं क्योंकि वे मेरे लिए समयपूर्व अनुकूलन की तरह लगते हैं। मैं कोड सफाई/पठनीयता/रखरखाव/आदि बलिदान होगा। इन परिवर्तनों को पूरा करने के लिए।
उदाहरण के लिए, निम्न कोड ले:
std::stringstream s;
s << "This" << "Is" << "a" << "string";
ऊपर, आवंटन की संख्या stringstream यहाँ बनाता अपरिभाषित है, यह 4 आवंटन, या सिर्फ 1 आवंटन हो सकता है। इसलिए हम उस अकेले के आधार पर अनुकूलित नहीं कर सकते हैं, लेकिन आम सहमति आम तौर पर एक निश्चित बफर का उपयोग करना है या किसी भी तरह से कम आवंटन का संभावित रूप से उपयोग करने के लिए कोड को संशोधित करना है। मैं वास्तव में स्ट्रिंगस्ट्रीम को स्मृति समस्याओं में भारी योगदानकर्ता के रूप में विस्तारित नहीं करता हूं, लेकिन शायद मैं गलत हूं।
जनरल सुधार कोड के लिए सुझाव ऊपर की तर्ज पर कर रहे हैं:
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
भी एक विशाल धक्का जहां कभी संभव ढेर के ऊपर ढेर उपयोग करने के लिए नहीं है।
क्या इस तरह मेमोरी विखंडन के बारे में पूर्ववत होना संभव है, या क्या यह केवल सुरक्षा की झूठी भावना है?
मुझे लगता है कि न्याय करने का एक आसान तरीका यह है: आप कार्यक्रमों में दो चीजों की चिंता करते हैं: कार्यान्वयन शुद्धता और कार्यान्वयन दक्षता। हम सभी दोनों श्रेणियों में उच्चतम चाहते हैं, लेकिन व्यावहारिक रूप से यह दक्षता पर शुद्धता पर ध्यान केंद्रित करना बेहतर है, क्योंकि दुनिया में सबसे कुशल गलत कार्यक्रम अभी भी गलत है, और अभी भी बेकार है। आपको दोनों अपनी योग्यता पर ध्यान केंद्रित करना चाहिए; * समयपूर्व अनुकूलन का अर्थ केवल शुद्धता * की तुलना में दक्षता पर अधिक ध्यान केंद्रित करना है। यदि आपके पास शुद्धता बलिदान के बिना इसे कुशल बनाने की क्षमता है, तो आपको निश्चित रूप से ऐसा करना चाहिए! – GManNickG
'फ्रैगमेंटेशन पहले से ही एक संदिग्ध मुद्दा है, क्योंकि हमारी स्मृति खपत समय के साथ बढ़ जाती है।' सादा पुरानी मेमोरी लीक मेरी राय में कहीं ज्यादा संभावना है - शायद उन लोगों पर शासन करना चाहें (और मेमोरी लीक चेकर के साथ वाल्ग्रिंड या ड्रममरी विखंडन के स्रोतों के लिए अपने पूरे कोड-बेस की जांच करने से भी अधिक आसान है) – smocking