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的非终结对象和可终结对象之间有什么不同?
据我所知,CLR有一个对象队列,已经注册了终结.实现终结器会将类型的对象放在队列中.因此,在构造函数调用的情况下SuppressFinalize,我想象对象实际上只是立即被删除,这可以解释开销.
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |