¿Es un objeto finalizable con GC.SuppressFinalize lo mismo que un objeto normal no configurable? El código de abajo parece demostrar que son tratados de manera diferente, tanto en .NET 2 y 4:GC.SuppressFinalize el rendimiento en comparación con el objeto no finalizable
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);
}
}
Agregar el finalizador, pero no cambiar nada más, hace que el código para tomar muy, muy largo (12601 ms en comparación con 889 ms).
Pensé que SuppressFinalize se fijó un poco en el encabezado del objeto haciendo que el GC trate el objeto igual que un objeto no finalizable, pero este no parece ser el caso. Entonces, ¿qué está pasando? ¿Qué es diferente entre un objeto no finalizable y un objeto finalizable con GC.SuppressFinalize invocado?
reprodé esto en .net 4.5 beta también –
A propósito, repetí la prueba, pero en su lugar medí el tiempo que tomó hacer 'GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); 'después de todos los' nuevos's. No hubo diferencias apreciables con vs. sin el finalizador (suprimido). – dlf