2012-03-28 14 views
9

¿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?

+2

reprodé esto en .net 4.5 beta también –

+0

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

Respuesta

7

Según tengo entendido, el CLR tiene una cola 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 al SuppressFinalize, imagino que el objeto realmente se pone en la cola solo para ser eliminado inmediatamente, lo que podría explicar la sobrecarga.

+3

Tu imaginación es precisa :) –

+1

Eso parece muy ineficiente. Un objeto no finalizable _debe comportarse exactamente igual que un objeto finalizable suprimido. Es bastante sorprendente que sea diferente – thecoop

+0

@thecoop: Tal vez, pero cualquier tipo que implemente un finalizador deberá tratarse de manera diferente en el momento de la construcción. Supongo que podría hacer una optimización para verificar si la finalización se suprime durante el constructor, pero no creo que valga la pena. En el caso común, la supresión ocurre algún tiempo después de la construcción del objeto. –

Cuestiones relacionadas