Là một đối tượng hoàn chỉnh với GC.SuppressFinalize giống như một đối tượng không thể tách rời bình thường? Mã bên dưới dường như chứng minh chúng được xử lý khác nhau, cả trên .NET 2 và 4:GC.SuppressFinalize hiệu suất so với đối tượng không thể kết thúc
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);
}
}
Thêm trình hoàn tất, nhưng không thay đổi bất kỳ điều gì khác, khiến mã mất nhiều thời gian hơn (12601 mili giây so với 889 mili giây).
Tôi nghĩ SuppressFinalize đặt bit trong tiêu đề đối tượng làm cho GC xử lý đối tượng giống như đối tượng không thể kết thúc, nhưng điều này dường như không đúng. Vì vậy những gì đang xảy ra? Điều gì là khác nhau giữa một đối tượng không thể kết thúc và một đối tượng finalizable với GC.SuppressFinalize được gọi là nó?
repro'd điều này trên .net 4,5 beta quá –
Ngẫu nhiên, tôi lặp lại bài kiểm tra, nhưng thay vào đó phải mất khoảng thời gian để thực hiện 'GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); 'sau tất cả' new's. Không có sự khác biệt đáng kể so với không có (finalizer) finalizer. – dlf