2012-07-23 5 views
8

मैं नेट सीएलआर जीसी पर एक परिचय प्रस्तुति कर रहा हूं और सभी विभिन्न टुकड़े हैं, लेकिन मैं विशेष रूप से एक उदाहरण चाहता था कि संग्रह को मजबूर करने की कोशिश कैसे खतरनाक या हानिकारक हो। मुझे पता है कि आप चीजों को समय-समय पर उच्च पीढ़ियों में मजबूर कर सकते हैं, लेकिन (जो मैं बता सकता हूं) से वास्तव में केवल चीजों को धीमा कर देगा।मजबूर जीसी का एक उदाहरण खराब हो गया?

मैं ऐसी स्थिति के बारे में सोचने की कोशिश कर रहा हूं जहां जीसी को मजबूर करना वास्तव में हानिकारक हो सकता है और मैं केवल कम कुशल समाधानों को जारी रखता हूं।

+2

समय की कमी एकमात्र नकारात्मक है। – Dialecticus

+0

"संग्रह को मजबूर करना" से मुझे लगता है कि आप जीसी.कोलेक्ट() को कॉल करके मतलब मानते हैं। आपको क्यों लगता है कि यह खतरनाक होगा? क्या कुछ दस्तावेज हैं जो मुझे याद आया जो ऐसा कहता है? (मुझे एहसास है कि संभावना अधिक है, क्योंकि मैं इन दिनों नहीं रख सकता।) – David

+0

वास्तविक समय आवश्यकताओं के साथ तंग टाइमर शायद? – leppie

उत्तर

4

यहां एक दिलचस्प प्रदर्शन है। ध्यान दें कि आपको रिलीज मोड में संकलित इस डेमो को चलाया जाना चाहिए या यह विज्ञापित के रूप में काम नहीं कर सकता है।

संस्करण 1:

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 
} 

संस्करण 1 खुशी से पाठ बॉक्स एक बार एक दूसरे के लिए दिनांक और समय प्रिंट होगा।

संस्करण 2:

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 

    GC.Collect(); // force a garbage collection 
} 
अब

संस्करण 2 में, दिनांक और समय केवल एक बार, क्योंकि घोषणा के बाद, वहाँ टाइमर वस्तु के लिए कोई और अधिक संदर्भ हैं प्रिंट किया जाएगा, और इसलिए टाइमर वस्तु हो जाता है एकत्र किया हुआ।

यह एक काफी योगदान वाला उदाहरण है लेकिन एक अच्छा प्रदर्शन करने के लिए बना सकता है।

मुझे इस के लिए जेफ़री रिचटर क्रेडिट करना होगा - यह उनकी उत्कृष्ट पुस्तक CLR via C# में है।

+0

मेरा मानना ​​है कि यह व्यवहार अधिक अप्रत्याशित होगा यदि आपने अभी 'नया टाइमर (...' कहा है और वापसी मूल्य को सहेजा नहीं है। –

+2

लेकिन इस मामले में, 'जीसी। कोलेक्ट()' खराब नहीं है, यह वास्तव में अच्छा है, क्योंकि इससे आपको एप्लिकेशन में एक बग खोजने में मदद मिली है। 'जीसी। कोलेक्ट()' के बिना, यह रहस्यमय रूप से भविष्य में कुछ समय काम करना बंद कर देगा। – svick

+0

@svick - अच्छा बिंदु। शायद यह स्कोपिंग पर एक बेहतर सबक है। किसी भी घटना में, यह दिलचस्प है और यह जीसी के बारे में एक सोचता है। – James

1

निम्नलिखित, बुरे विचारों के बारे में क्या? "अनुरोध राज्य को साफ करने के लिए एएसपी.नेट में प्रत्येक HTTP अनुरोध के बाद एक जीसी को मजबूर करें जो निश्चित रूप से अनाथ हो जाएगा!"

यह एक बुरा विचार है क्योंकि समवर्ती HTTP अनुरोध एक दूसरे के साथ हस्तक्षेप करेगा। यह विलंबता स्पाइक्स के बहुत सारे परिचय देगा और प्रदर्शन को नष्ट कर देगा। जो एक निर्दोष "अनुकूलन" से शुरू होता है।

यह सबसे खराब है जिसके बारे में मैं सोच सकता हूं।

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