2012-03-28 7 views
9

की तुलना में प्रदर्शन को अंतिम रूप देना जीसी.Suppress के साथ एक अंतिम वस्तु है सामान्य सामान्य अनावश्यक वस्तु के रूप में समान है? नीचे दिए गए कोड नेट 2 और 4 पर दोनों साबित करने के लिए वे अलग तरह से व्यवहार कर रहे हैं, लगता है:जीसी.Suppress गैर-अंतिम प्रयोज्य ऑब्जेक्ट

class Class1 { 

    public Class1() 
    { 
     GC.SuppressFinalize(this); 
    } 

    //~Class1() { } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 

     for (int i=0; i<100000000; i++) 
     { 
      new Class1(); 
     } 

     sw.Stop(); 
     Console.WriteLine(sw.ElapsedMilliseconds); 
    } 
} 

finalizer जोड़ा जा रहा है, लेकिन कुछ और नहीं बदल रहा है, अब तक दूर नहीं रह गया (12601 एमएस की तुलना में लेने के लिए कोड का कारण बनता है 88 9 एमएस)।

मैंने सोचा कि SuppressFinalize ऑब्जेक्ट हेडर में थोड़ा सा सेट करता है जिससे जीसी ऑब्जेक्ट को एक गैर-अंतिम वस्तु के समान व्यवहार करता है, लेकिन ऐसा लगता है कि यह मामला नहीं है। तो क्या चल रहा है? एक गैर-अंतिम वस्तु के बीच क्या भिन्न है और GC.SuppressFinalize के साथ एक अंतिम वस्तु को बुलाया जाता है?

+2

ने इसे 4.5 नेट बीटा पर भी दोहराया –

+0

संयोग से, मैंने परीक्षण दोहराया, लेकिन इसके बजाय समय 'जीसी' कोलेक्ट() करने में कितना समय लगा। GC.WaitForPendingFinalizers(); जीसी। चयन(); 'सभी' नए 'के बाद। बनाम (दबाने वाले) फाइनलाइज़र के बिना बनाम कोई सराहनीय अंतर नहीं था। – dlf

उत्तर

7

जैसा कि मैं समझता हूं कि सीएलआर में ऑब्जेक्ट्स की कतार है जिसके लिए अंतिमकरण पंजीकृत किया गया है। एक फाइनलर लागू करने से कतार पर प्रकार की वस्तुएं डाली जाएंगी। तो ऐसे मामले में जहां कन्स्ट्रक्टर SuppressFinalize पर कॉल करता है, मुझे लगता है कि ऑब्जेक्ट वास्तव में कतार पर तुरंत हटा दिया जाता है, जो ओवरहेड को समझा सकता है।

+3

आपकी कल्पना सटीक है :) –

+1

यह बहुत अक्षम लगता है। एक गैर-अंतिम वस्तु ऑब्जेक्ट _should_ एक दबाने वाले अंतिम वस्तु के समान बिल्कुल व्यवहार करता है। यह काफी आश्चर्यजनक है कि यह अलग है – thecoop

+0

@thecoop: शायद, लेकिन किसी भी प्रकार जो फाइनलर लागू करता है उसे निर्माण समय पर अलग-अलग इलाज करने की आवश्यकता होगी। मुझे लगता है कि आप यह देखने के लिए एक अनुकूलन कर सकते हैं कि कन्स्ट्रक्टर के दौरान अंतिमकरण दबाया गया है, लेकिन मुझे विश्वास नहीं है कि यह प्रयास के लायक है। सामान्य मामले में दमन वस्तु के निर्माण के कुछ समय बाद होता है। –

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