tipos pattern net destructors crear constructores clases .net garbage-collection finalizer

.net - pattern - GC.SuppressFinalize el rendimiento en comparación con el objeto no finalizable



destructors in c# (1)

Según tengo entendido, el CLR tiene una fila de objetos para los que se ha registrado la finalización. La implementación de un finalizador colocará objetos del tipo en la cola. Entonces, en el caso en que el constructor llame a SuppressFinalize , imagino que el objeto realmente se pone en la cola solo para ser eliminado inmediatamente, lo que podría explicar la sobrecarga.

¿Es un objeto finalizable con GC.SuppressFinalize lo mismo que un objeto normal no configurable? El código siguiente parece demostrar que se tratan de manera diferente, tanto en .NET 2 como en 4:

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 sin cambiar nada más, hace que el código tarde mucho más (12601 ms en comparación con 889 ms).

Pensé que SuppressFinalize se ajustaba un poco en el encabezado del objeto haciendo que el GC tratara 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?