Производительность GC.SuppressFinalize по сравнению с не финализируемым объектом - PullRequest
10 голосов
/ 28 марта 2012

Является ли финализуемый объект с 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 обрабатывать объект так же, как не финализуемый объект, но, похоже, это не так. Так, что происходит? Чем отличается не финализируемый объект от финализируемого объекта с вызовом GC.SuppressFinalize?

1 Ответ

8 голосов
/ 29 марта 2012

Насколько я понимаю, в CLR есть очередь объектов, для которых было зарегистрировано завершение. Реализация финализатора поместит объекты этого типа в очередь. Таким образом, в случае, когда конструктор вызывает SuppressFinalize, я представляю, что объект фактически помещается в очередь только для немедленного удаления, что может объяснить дополнительные затраты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...