2012-03-28 14 views
9

Un oggetto finalizzabile con GC.SuppressFinalize è uguale a un normale oggetto non definibile? Il codice qui sotto sembra dimostrare che stanno trattati in modo diverso, sia su .NET 2 e 4:GC.SuppressFinalize delle prestazioni rispetto a oggetti non modificabili

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); 
    } 
} 

Aggiungendo il finalizzatore, ma non cambiare niente altro, fa sì che il codice per tenere lontano molto più a lungo (12601 ms rispetto al 889 ms).

Ho pensato che SuppressFinalize abbia impostato un po 'nell'intestazione dell'oggetto, facendo in modo che il GC consideri l'oggetto come un oggetto non finalizzabile, ma non sembra essere il caso. Quindi cosa sta succedendo? Cosa c'è di diverso tra un oggetto non finalizzabile e un oggetto finalizzabile con GC.SuppressFinalize chiamato su di esso?

+2

riproporzionato su .net 4.5 beta troppo –

+0

Per inciso, ho ripetuto il test, ma invece ho cronometrato il tempo necessario per eseguire 'GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); 'dopo tutto il' new's. Non c'era alcuna differenza apprezzabile con vs. senza il finalizzatore (soppresso). – dlf

risposta

7

Come ho capito, il CLR ha una coda di oggetti per i quali è stata registrata la finalizzazione. L'implementazione di un finalizzatore metterà gli oggetti del tipo in coda. Quindi, nel caso in cui il costruttore chiami SuppressFinalize, immagino che l'oggetto venga effettivamente messo in coda solo per essere rimosso immediatamente, il che potrebbe spiegare il sovraccarico.

+3

La tua immaginazione è precisa :) –

+1

Sembra molto inefficiente. Un oggetto non finalizzabile _should_ si comporta esattamente come un oggetto finalizzabile soppresso. È abbastanza sorprendente che sia diverso – thecoop

+0

@thecoop: Forse, ma qualsiasi tipo che implementa un finalizzatore dovrà essere trattato in modo diverso al momento della costruzione. Immagino che potresti fare un'ottimizzazione per verificare se la finalizzazione è stata soppressa durante il costruttore, ma non credo che ne valga la pena. Nel caso comune la soppressione avviene qualche tempo dopo la costruzione dell'oggetto. –

Problemi correlati