2009-03-10 16 views
9

बहुत से अस्थायी वस्तुओं (यानी अंतरिम परिणामों के लिए) उत्पन्न करने का उपर क्या है जो "युवा मर जाते हैं" (कचरा संग्रहण अंतराल के दौरान अगली पीढ़ी को कभी भी बढ़ावा नहीं दिया जाता है)? मुझे लगता है कि "नया" ऑपरेशन बहुत सस्ता है, क्योंकि यह वास्तव में केवल एक सूचक वृद्धि है। हालांकि, इस अस्थायी "कूड़े" से निपटने की छिपी लागत क्या हैं?अल्पकालिक वस्तुओं

+0

यदि आपके पास वास्तव में सरल वस्तुएं हैं, और विशेष रूप से यदि वे रीसेट करना आसान हैं, तो ऑब्जेक्ट पूल बनाएं और उनका पुन: उपयोग करें। यह जटिल वस्तुओं के लिए भी काम कर सकता है। एक बार मेरे पास ऐसा ऐप था जिसने इंटीरेम टेक्स्ट को चित्रित करने के लिए हजारों छोटे बिटमैप्स बनाए जिन्हें तर्कसंगत कारणों से सीधे पृष्ठ पर खींचा नहीं जा सका। पीजीएस के 1000s के लिए, आकार का पुन: उपयोग किया गया। 'निपटान' के बजाए, मैंने उन्हें 'फ्री' हैश तालिका में रखा क्योंकि कुंजी चौड़ाई हेइट (बिटमैप्स की एक सूची की ओर इशारा किया गया) और इसे नया करने से पहले जांच की गई। यदि वहां है, तो इसे हटा दें, इसे प्रयोग में रखें। महंगा लगता है, लेकिन बिटमैप्स बनाना और भी खराब होना चाहिए। विशाल गति। – FastAl

+0

@FastAl मुझे लगता है कि आपका मतलब कुछ है ['System.Drawing.Bitmap'] (https://msdn.microsoft.com/en-us/library/system.drawing.bitmap%28v=vs.110%29.aspx) जो "एक जीडीआई + बिटमैप को लागू करता है" जिसका अर्थ है [बनाने/नष्ट करने के लिए एक syscal की तरह कुछ] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29। एएसपीएक्स) उन्हें। यह शुद्ध नेट नेट ऑब्जेक्ट्स से काफी अलग है जो मुझे लगता है कि ओपी पूछ रहा है। – binki

+0

@ बिन्की - आप बिटमैप के बारे में सही हैं, यह सादे वस्तुओं की तुलना में पाठ्यक्रम का अधिक खर्च है। लेकिन अगर लूप पर्याप्त तंग है और आप वस्तुओं के साथ ज्यादा कुछ नहीं कर रहे हैं ... गति बढ़ने के बावजूद उन्हें फिर से उपयोग करने लायक हो सकता है। जीसी को अभी भी कुछ करना है। बेशक उस मामले में, यह निर्भर करता है। वह आकार का उल्लेख नहीं करता है, बिटमैप्स अस्थायी हो सकता है और जैसा कि आप उल्लेख करते हैं कि उनके लिए काफी छिपी हुई लागत है। नई वस्तुएं, यदि बड़ी हो, तो उपयोग से पहले भी मंजूरी दे दी जा सकती है, अगर आपका कोड ओवरराइट करता है तो वैसे भी इसका मतलब हो सकता है कि इसका मतलब 2x स्पीडअप (उस तरह का निंजा था)। – FastAl

उत्तर

12

बहुत कुछ नहीं - कचरा कलेक्टर gen0 के लिए बहुत तेज़ है। यह जीन 0 के आकार को समायोजित करता है, यह इस बात पर निर्भर करता है कि यह हर बार इकट्ठा करने के लिए कितना प्रबंधन करता है। (यह एक बहुत इकट्ठा करने में कामयाब रहा है, यह पहले अगली बार इकट्ठा करने के लिए gen0 का आकार कम हो जाएगा, और इसके विपरीत।)

अंतिम परीक्षण कैसे अपने आवेदन हालांकि करता है। पेर्फोन यहां बहुत आसान है, यह दर्शाता है कि जीसी में कितना समय व्यतीत किया गया है, प्रत्येक पीढ़ी के कितने संग्रह हैं।

+1

डाउनवॉटर: टिप्पणियां आपका स्वागत है, अन्यथा कोई भी नहीं (मुझे समेत) पता चलेगा कि आप मेरे उत्तर के बारे में क्या असहमत हैं ... –

+1

मुझे पेर्फमॉन कहां मिल सकता है? – Karl

+2

यह लगभग आपके विंडोज बॉक्स पर लगभग निश्चित रूप से स्थापित है। विंडोज-आर हिट करें और बस "परफमन" टाइप करें। अन्यथा यह खोजना आपके द्वारा उपयोग किए जा रहे विंडोज़ के संस्करण पर निर्भर करेगा। –

3

जैसा कि आप कहते हैं कि आवंटन स्वयं बहुत सस्ती है। बहुत कम अल्पकालिक वस्तुओं को उत्पन्न करने की लागत अधिक बार कचरा संग्रह होती है क्योंकि पीढ़ी 0 के बजट समाप्त होने पर वे ट्रिगर होते हैं। हालांकि, एक पीढ़ी 0 संग्रह काफी सस्ता है, इसलिए जब तक आपका ऑब्जेक्ट वास्तव में छोटा रहता है, तब तक ओवरहेड अधिक महत्वपूर्ण नहीं होता है।

दूसरी तरफ लूप में कई तारों को संयोजित करने का सामान्य उदाहरण कचरा कलेक्टर को महत्वपूर्ण रूप से धक्का देता है, इसलिए यह आपके द्वारा बनाई गई वस्तुओं की संख्या पर निर्भर करता है। यह आवंटन के बारे में सोचने के लिए चोट नहीं पहुंचाता है।

कचरा संग्रह की लागत यह है कि प्रबंधित धागे को संकुचन के दौरान निलंबित कर दिया जाता है।

1

सामान्यतः, ऐसा कुछ नहीं है जिसके बारे में आपको चिंता करना चाहिए और लगता है जैसे यह "माइक्रो-ऑप्टिमाइज़ेशन" के बहुत करीब गिरना शुरू हो जाता है। जीसी को इस धारणा के साथ डिजाइन किया गया था कि "अच्छी तरह से ट्यून किए गए एप्लिकेशन" में Gen0 में इसके सभी आवंटन होंगे - जिसका अर्थ है कि वे सभी "युवा मर जाते हैं"। जब भी आप एक नई वस्तु आवंटित करते हैं तो यह हमेशा Gen0 में होता है। एक संग्रह तब तक नहीं होगा जब तक कि Gen0 दहलीज पास नहीं हो जाती है और अगले आवंटन को पकड़ने के लिए Gen0 में पर्याप्त उपलब्ध स्थान नहीं है।

  1. आवंटन स्मृति
  2. प्रकार निर्माता
  3. स्मृति
  4. अगले ऑब्जेक्ट सूचक
  5. बढ़ाने के लिए सूचक लौट चल:

    'नई' आपरेशन वास्तव में चीजों की एक गुच्छा है

0

यदि इन वस्तुओं को कभी भी जनरेशन 0 से बाहर नहीं किया जाता है तो आपको बहुत अच्छा प्रदर्शन दिखाई देगा। एकमात्र छिपी हुई लागत मैं देख सकता हूं कि यदि आप अपने जेनरेशन 0 बजट से अधिक हो जाते हैं तो आप जीसी को ढेर को कम करने के लिए मजबूर करेंगे लेकिन जीसी आत्म-ट्यून करेगा ताकि यह चिंता का विषय न हो।

0

कचरा संग्रह .NET में पीढ़ी है। लघु जीवित वस्तुओं को पहले और अक्सर एकत्रित किया जाएगा। जनरल 0 संग्रह सस्ता है, लेकिन आपके द्वारा बनाई जा रही वस्तुओं की संख्या के पैमाने पर निर्भर करता है, यह काफी महंगा हो सकता है। मैं यह पता लगाने के लिए एक प्रोफाइलर चलाऊंगा कि यह प्रदर्शन को प्रभावित कर रहा है या नहीं। यदि ऐसा है, तो उन्हें structs पर स्विच करने पर विचार करें। इन्हें एकत्र करने की आवश्यकता नहीं है।

1

हालांकि नया ऑपरेशन डिज़ाइन और कुशलता से लिखा गया है, यह मुफ़्त नहीं है और इसमें नई मेमोरी आवंटित करने में समय लगता है। स्मृति आवंटन लाइब्रेरी को ट्रैक करने की आवश्यकता है कि आवंटन के लिए कौन से भाग उपलब्ध हैं और नई आवंटित स्मृति शून्य है।

युवाओं को मरने वाली बहुत सारी वस्तुओं को बनाना अक्सर कचरा संग्रह को ट्रिगर करेगा और यह ऑपरेशन महंगा हो सकता है। खासतौर पर "दुनिया को रोकें" कचरा कलेक्टरों के साथ। http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

नोट::

यह ऐसे काम करता पर MSDN से एक लेख है यह वर्णन करता है कि कैसे कचरा संग्रहण बुला महंगा है, क्योंकि यह पहले यह कचरा संग्रहण शुरू कर सकते हैं वस्तु ग्राफ का निर्माण करने की जरूरत है।

+0

लिंक किए गए आलेख से: "ये परीक्षण यह भी दिखाते हैं कि 200 मेगाहट्र्ज पेंटियम पर 1 मिलीसेकंड से कम पीसीएफ बनाने के लिए 1 मिलीसेकंड से कम समय लगता है। यह माइक्रोसॉफ्ट का लक्ष्य है कि जीसी को सामान्य पेज गलती से ज्यादा समय नहीं लगे।" मुश्किल से "बहुत महंगा" आईएमओ। नि: शुल्क नहीं, निश्चित रूप से, लेकिन अगर (cont।) –

+0

कोड बहुत छोटी, छोटी-छोटी वस्तुओं के साथ अधिक पठनीय है तो मैं तब तक उस तरह से जाऊंगा जब तक कि यह साबित न हो जाए * सिद्ध * मेरे डिजाइन को झुकाव से बोतल-गर्दन होने के लिए एक प्रदर्शन "समस्या" का सामना करने के लिए आकार से बाहर जो कोई समस्या नहीं हो सकती है। –

+0

मैं सहमत हूं और मैं यह नहीं कह रहा हूं कि उन्हें बदलना चाहिए कि वे प्रोग्राम कैसे लिखते हैं। सवाल पूछा गया कि अंतर्निहित ओवरहेड क्या हैं, और मैंने जवाब देने की कोशिश की। –

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