2012-03-28 20 views
9

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ó?

+2

repro'd điều này trên .net 4,5 beta quá –

+0

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

Trả lời

7

Như tôi đã hiểu, CLR có hàng đợi các đối tượng đã hoàn thành đăng ký. Thực hiện một finalizer sẽ đặt các đối tượng của loại trên hàng đợi. Vì vậy, trong trường hợp các nhà xây dựng gọi SuppressFinalize, tôi tưởng tượng rằng đối tượng thực sự được đặt trên hàng đợi chỉ để được loại bỏ ngay lập tức, có thể giải thích chi phí.

+3

Trí tưởng tượng của bạn là chính xác :) –

+1

Điều đó có vẻ rất kém hiệu quả. Một đối tượng không thể hoàn thành _should_ hành xử chính xác giống như một đối tượng có thể kết thúc bị triệt tiêu. Nó khá ngạc nhiên rằng nó khác nhau – thecoop

+0

@thecoop: Có lẽ, nhưng bất kỳ loại nào thực hiện một finalizer sẽ cần phải được xử lý khác nhau tại thời gian xây dựng. Tôi đoán bạn có thể thực hiện một tối ưu hóa để kiểm tra nếu hoàn thành được đàn áp trong quá trình xây dựng, nhưng tôi không tin rằng nó là giá trị nỗ lực. Trong trường hợp đàn áp thông thường xảy ra một thời gian sau khi xây dựng đối tượng. –

Các vấn đề liên quan