2009-04-15 18 views
16

मुझे पता है कि सबसे अच्छा अभ्यास किसी भी वस्तु है कि IDisposable लागू करता है पर निपटान कॉल करने के लिए है हूँ, विशेष रूप से, वस्तुओं है कि फ़ाइल हैंडल, सॉकेट, GDI हैंडल की तरह परिमित संसाधनों लपेट आदिवास्तव में फ़ॉन्ट का निपटान करना कितना महत्वपूर्ण है?

लेकिन मैं एक मामले में चल रहा हूँ जहां मेरे पास एक ऑब्जेक्ट है जिसमें एक फ़ॉन्ट है, और मुझे ऑब्जेक्ट्स की कई परतों के माध्यम से आईडीस्पोजेबल को प्लंब करना होगा, और यह सुनिश्चित करने के लिए कि मैं हमेशा फ़ॉन्ट का निपटारा करता हूं, बहुत सारे उपयोग की समीक्षा करता हूं। और मैं सोच रहा हूं कि यह जटिलता के लायक है या नहीं।

फ़ॉन्ट एक एचएफओटी लपेटने पर यह एक बात होगी, क्योंकि जीडीआई संसाधन सिस्टम-ग्लोबल हैं। लेकिन फ़ॉन्ट एक जीडीआई हैंडल लपेटता नहीं है; यह जीडीआई + है, जो एक पूरी तरह से अलग प्रणाली है, और जहां तक ​​मैं समझता हूं, प्रक्रिया-स्थानीय है, जीडीआई की तरह सिस्टम-ग्लोबल नहीं है। और छवि के विपरीत, फ़ॉन्ट कभी भी फाइल सिस्टम संसाधनों (जो मुझे पता है, वैसे भी) पर नहीं है।

तो मेरा सवाल यह है कि: फ़ॉन्ट को कचरा इकट्ठा करने की वास्तविक लागत क्या है?

मुझे पता है कि मैं अंतिमकर्ता के लिए एक छोटी सी हिट लेगा, लेकिन अगर "लीक" फ़ॉन्ट्स की संख्या छोटी है (आधा दर्जन कहें), जो ईमानदारी से मारा जाता है, वह ध्यान देने योग्य नहीं होगा। फाइनेंजर के अलावा, यह मध्य आकार के सरणी को आवंटित करने और जीसी को साफ करने से बहुत अलग नहीं लगता है - यह सिर्फ स्मृति है।

क्या कोई लागत है जो मुझे फ़ॉन्ट को जीसीड प्राप्त करने में अवगत नहीं है?

उत्तर

5

सरल जवाब: अगर अपने बस कुछ ही, तो कोई। यदि यह बहुत है, तो हाँ। यदि आपका आवेदन पहले ही कचरा कलेक्टर पर जोर दे रहा है, तो हाँ। मैं चारों ओर बैठे ऑब्जेक्ट्स की संख्या देखने के लिए परफॉर्म का उपयोग करता हूं, और उच्च पीढ़ियों को पदोन्नत किया जाता है, और फिर निर्णय लेता है।

4

समस्या यह है कि कचरा संग्रह केवल तब होता है जब स्मृति दबाव होता है। प्रायः, अप्रबंधित हैंडल स्मृति से अधिक प्रतिबंधित होते हैं, इसलिए आप जीसी होने से पहले हैंडल से बाहर हो सकते हैं, जिससे त्रुटियां होती हैं।

लेकिन एक या दो Font उदाहरणों के लिए, यह आपको अत्यधिक नुकसान नहीं पहुंचाएगा।

एक बड़ा समस्या है कि वस्तुओं में से कुछ साझा कर रहे हैं और ऐसा करना चाहिए नहीं है (या नहीं कर सकते हैं) समय से पहले ही निपटारा किया जाना ...

+0

"अक्सर, अप्रबंधित हैंडल स्मृति से अधिक प्रतिबंधित होते हैं" - निश्चित रूप से। लेकिन क्या यह सच है कि जीडीआई + फ़ॉन्ट विशेष रूप से हैंडल करता है? यह मेरे प्रश्न का हिस्सा है। –

4

ऐसा करने के बाद आप इसका निपटान क्यों नहीं करेंगे? सिर्फ इसलिए कि हमारे पास सड़क सफाई करने वालों का मतलब यह नहीं है कि हमें सड़कों पर कूड़ेदान करना चाहिए। हालांकि, उदाहरण में, यदि ऑब्जेक्ट के जीवनकाल के लिए फ़ॉन्ट की आवश्यकता है तो उस ऑब्जेक्ट के निपटान में फ़ॉन्ट का निपटान करें। ऐसी कई चीजें हैं जो मेरे कोड को भी सरल बनाती हैं, लेकिन यह उन परिवर्तनों को न्यायसंगत नहीं ठहराती है - कभी-कभी ऐसी चीजें होती हैं जो आपको करना चाहिए, भले ही यह दर्द हो।

हमेशा अपने आप को व्यवस्थित करना एक अच्छा विचार है। जब आपको अब कुछ चाहिए, तो इसका निपटान करें। इस तरह आप गंदे दौड़ की स्थिति से बच सकते हैं, स्मृति अपवादों से बाहर, ग्लिच ड्राइंग, और लंबा, प्रोसेसर-गहन कचरा संग्रह।

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

साथ फ़ॉन्ट के संबंध

, MSDN says:

हमेशा निपटान फोन से पहले आप फ़ॉन्ट के लिए अपने अंतिम संदर्भ छोड़ें।अन्यथा, जो संसाधन इसका उपयोग कर रहे हैं उन्हें तब तक मुक्त नहीं किया जाएगा जब तक कचरा कलेक्टर फ़ॉन्ट ऑब्जेक्ट की अंतिम विधि को कॉल न करे।

यह नहीं कहता कि संसाधन क्या हैं लेकिन तथ्य यह है कि वे स्पष्ट रूप से बताते हैं कि यह निष्पक्षता से निपटने के लिए महत्व जोड़ना चाहिए।

+5

आप इसका निपटान क्यों नहीं करेंगे? वैसे ओपी ने कहा था क्यों: क्योंकि यह अपने कोड को जबरदस्त सरल बना देगा। –

+2

जब किसी नियंत्रण की फ़ॉन्ट प्रॉपर्टी (या पिक्चर प्रॉपर्टी, या जो कुछ भी) किसी ऑब्जेक्ट पर सेट की जाती है, तो नियंत्रण में ऑब्जेक्ट की प्रतिलिपि किस मामले में होती है (जिस स्थिति में मुझे दिमाग का निपटान करना चाहिए, और इसे अपने निपटान करना चाहिए), और किस मामले में नियंत्रण पारित वस्तु का उपयोग जारी रखने की अपेक्षा करता है? अगर मेरे ड्रूटर थे, तो यह निर्दिष्ट करने का एक तरीका होगा कि नियंत्रण को पास किए गए ऑब्जेक्ट के स्वामित्व को ग्रहण करना चाहिए, लेकिन चूंकि ऐसा नहीं है, तो किसी को क्या करना चाहिए? – supercat

+0

@supercat: दस्तावेज आपको इंगित करना चाहिए कि नियम स्वामित्व के संबंध में क्या हैं। हालांकि, आपको कम से कम यह मानना ​​चाहिए कि नियंत्रण फ़ॉन्ट का संदर्भ दे रहा है, आपको इसे निपटाना नहीं चाहिए। हालांकि, मैं अपेक्षा करता हूं कि जब नियंत्रण निपटाया जाता है तो नियंत्रण फ़ॉन्ट को डिस्पोजेक्ट करता है, लेकिन मुझे निश्चित रूप से पता नहीं है। –

1

अंतिमकर्ता कक्षाओं में विशेष रूप से बनाए जाते हैं क्योंकि सफाई आवश्यक है। भले ही आपके पास साफ करने के लिए बड़ी या छोटी मात्रा में वस्तुएं हों, भले ही उन्हें साफ करना अच्छा अभ्यास हो।

जीसी को अपने स्वयं के छद्म मन के लिए बनाया गया था। अपनी वस्तुओं का सही ढंग से निपटान करके, आप जीसी को ऐसा करने की अनुमति दे रहे हैं जो इसे करने के लिए किया गया था।

हालांकि, यदि आप बड़ी संख्या में फ़ॉन्ट ऑब्जेक्ट्स बना रहे हैं और उन सभी का निपटान कर रहे हैं, तो जीसी क्लीनअप को शुरू करने के लिए हर बार उचित पीढ़ी (शायद पीढ़ी 0) पर जीसी को कॉल करना फायदेमंद हो सकता है। इस बात पर निर्भर करता है कि आप किस प्रकार की अन्य वस्तुओं को बड़ी संख्या में तत्काल कर रहे हैं। आपका लक्ष्य उन वस्तुओं को रखना चाहिए जिन्हें आप जानते हैं कि आप बड़ी पीढ़ियों में पदोन्नत होने से बहुत लंबे समय तक उपयोग नहीं कर रहे हैं। यह जीसी के नौकरी दुबला & मतलब रखता है।

बस अपना सर्वश्रेष्ठ निर्णय लें और आप ठीक होंगे। लेकिन वास्तव में किसी भी वस्तु को अंतिम अभ्यास के रूप में अंतिम रूप देने के साथ निपटें।

2

कुछ भी का निपटान करना कितना महत्वपूर्ण है? IMHO जब आप इस तरह के प्रश्न पूछना शुरू करते हैं, तो ऐसा लगता है कि आपके कोड में एक डिज़ाइन समस्या है। आपको उन चीज़ों का हमेशा निपटान करना चाहिए जिनकी आपको आवश्यकता नहीं है - जिसे जिम्मेदार प्रोग्रामिंग कहा जाता है।

आपकी समस्या का संभावित समाधान:

  • पारित न करें चारों ओर Fonts की तरह वस्तुओं। फ़ॉन्ट स्थान का उपयोग एक स्थान (एक वर्ग) में लागू करें, उस वर्ग के क्षेत्र के रूप में फ़ॉन्ट जोड़ें और उस कक्षा के लिए IDisposable लागू करें।

  • एक फ़ॉन्ट कैश वर्ग कार्यान्वित करें - बजाय सभी अपने कोड पर new ऑपरेटर का उपयोग कर नए Font वस्तुओं बनाने के बजाय, वांछित Font प्राप्त करने के लिए इस वर्ग का उपयोग करें। यदि संभव हो, तो कक्षा में मौजूदा फ़ॉन्ट्स का पुन: उपयोग करने के लिए तर्क हो सकता है। या स्मृति में पिछले 10 फोंट रखने के लिए, और दूसरों का निपटान करने के लिए। कैश के लिए IDisposable लागू करें, जिसे आपके ऐप के जीवन चक्र में एक बार बुलाया जाएगा।

+0

फ़ॉन्ट कैश क्लास को तब पता चलेगा जब फोंट का उपयोग नहीं किया जा रहा है? क्या आपको फ़ॉन्ट को कैश में "वापस" करना होगा? – Arafangion

+0

हां, इसे कहने का एक तरीका होना होगा कि आपको अब फ़ॉन्ट की आवश्यकता नहीं है। मैं आमतौर पर ऐसा कुछ 'लीज' वर्ग का उपयोग करके करता हूं जो 'आईडीस्पोजेबल' लागू करता है, और 'निपटान()' विधि में यह कैश से संपर्क करता है और संदर्भ गणना को कम करने के लिए कहता है। कारखानों के लिए एक ही पैटर्न का उपयोग किया जा सकता है। –

+0

क्या वह वापस वर्ग में नहीं है, तो? कम से कम, हालांकि, अब आपके पास एक प्रबंधक है जो आपके संभावित महंगे फोंट का प्रबंधन करता है, लेकिन यह सवाल पूछता है: आपको यह क्यों नहीं मानना ​​चाहिए कि कन्स्ट्रक्टर/फैक्ट्री और कचरा कलेक्टर बहुमत में कार्य नहीं कर सकता परिस्थितियों में? – Arafangion

-2

मेरे पास कम से कम एक अन्य ऐप चल रहा है जो .NET रनटाइम का उपयोग करता है। मैं OutOfMemoryExceptions प्राप्त करना जारी रखता हूं। आपके एप्लिकेशन को व्यवहार करने के लिए अच्छा होगा, इसलिए अन्य ऐप्स अपवाद नहीं फेंकते हैं जब उन्हें पर्याप्त संसाधन नहीं मिलते हैं।

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