Ist ein finalisierbares Objekt mit GC.SuppressFinalize das gleiche wie ein normales nicht entklinkbares Objekt? Der Code scheint unten zu beweisen, sind sie anders behandelt, auf beiden .NET 2 und 4:GC.SuppressFinalize-Leistung im Vergleich zu nicht finalisierbarem Objekt
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);
}
}
die Finalizerthread Hinzufügen, aber nicht irgendetwas anderes zu ändern, den Code verursacht weit weit mehr (12601 ms nehmen im Vergleich zu 889 ms).
Ich dachte, SuppressFinalize ein wenig in der Objekt-Header gesetzt, so dass der GC behandeln das Objekt das gleiche wie ein nicht finalisierbar Objekt, aber dies scheint nicht der Fall zu sein. So was ist los? Was unterscheidet ein nicht finalisierbares Objekt von einem finalisierbaren Objekt mit GC.SuppressFinalize?
repro'd dies auf .net 4.5 beta too –
Übrigens wiederholte ich den Test, aber stattdessen Zeit, wie lange es dauerte, um 'GC.Collect() zu tun; GC.WaitForPendingFinalizers(); GC.Collect(); 'nach all den' neuen '. Es gab keinen nennenswerten Unterschied zu vs ohne den (unterdrückten) Finalizer. – dlf