Производительность GC.SuppressFinalize по сравнению с нефинализируемым объектом

Является ли финализируемый объект с GC.SuppressFinalize таким же, как обычный нефинализируемый объект? Код ниже, кажется, доказывает, что они обрабатываются по-разному, как в .NET 2, так и в 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);
    }
}

Добавление финализатора без изменения чего-либо еще приводит к тому, что код выполняется намного дольше (12601 мс по сравнению с 889 мс).

Я думал, что SuppressFinalize устанавливает бит в заголовке объекта, заставляя сборщик мусора рассматривать объект так же, как не подлежащий финализации объект, но, похоже, это не так. Так что же происходит? В чем разница между нефинализируемым объектом и финализируемым объектом с вызовом GC.SuppressFinalize?

10
задан thecoop 28 March 2012 в 17:48
поделиться