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

the*_*oop 10 .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);
    }
}
Run Code Online (Sandbox Code Playgroud)

添加终结器但不更改任何其他内容会导致代码花费更长的时间(12601 ms与889 ms相比).

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

Bri*_*sen 8

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

  • 你的想象力是准确的:) (3认同)