GC.SuppressFinalize与可正常不可终结对象相同的可终止对象?下面的代码似乎证明他们区别对待,无论是在.NET 2和4:GC.SuppressFinalize与非可终结对象相比的性能
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上调用的可终结对象之间有什么不同?
也在.net 4.5 beta版本上声明了这一点 – 2012-03-28 17:58:21
顺便提一下,我重复了这个测试,而是计算了执行GC.Collect()所需的时间。 GC.WaitForPendingFinalizers(); GC.Collect();'在所有'new's之后。没有(压制)终结者没有明显的区别。 – dlf 2017-07-27 20:59:44