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?
riproporzionato su .net 4.5 beta troppo –
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