GC.SuppressFinalize性能与非可终结对象相比

时间:2012-03-28 17:48:54

标签: .net garbage-collection finalizer

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 ms与889 ms相比)。

我认为SuppressFinalize在对象标题中设置了一点,使GC将对象视为与非终结对象相同,但似乎并非如此。发生什么了?在调用GC.SuppressFinalize的情况下,非终结对象和可终结对象之间有什么不同?

1 个答案:

答案 0 :(得分:8)

据我了解,CLR有一个已注册终结的对象队列。实现终结器会将类型的对象放在队列中。因此,在构造函数调用SuppressFinalize的情况下,我想象对象实际上只是被放在队列中才能立即删除,这可以解释开销。