2012-06-11 31 views

Trả lời

5

Không có bất kỳ loại tối ưu hóa trên cuộc gọi này trong CHÍ chế độ.

Cuộc gọi có trong IL. Sự khác biệt duy nhất là nó không có hiệu lực nếu không có DEBUGGER hiện tại.

Từ tài liệu Debugger.Log:

Nếu không có debugger đính kèm, phương pháp này không có tác dụng.

Tôi khuyên bạn nên đo lường hiệu suất của ứng dụng và sau đó chọn các bước để làm theo.

Nếu không có sự khác biệt đáng kể (từ quan điểm của ứng dụng của bạn), tôi sẽ để nguyên nhật ký đó. Bằng cách này, trong thời điểm cần, bạn có thể đính kèm vào ứng dụng của mình bằng trình gỡ lỗi và nhận tin nhắn bạn có thể cần từ nhật ký, vì Debugger.Log sẽ hoạt động tại rằng điểm.

0

Một thử nghiệm nhanh của đoạn mã sau (NET 4, phát hành, Bất kỳ CPU)

class Program 
{ 
    static void Main(string[] args) 
    { 
    #if (DEBUG) 
     Debugger.Log(0, "category", "msg"); 
    #endif 
    } 
} 

sản xuất IL này

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: ret 
} 

Như bạn có thể thấy có NO cuộc gọi đến Debugger.Log.

1

Đây là tuyên bố cho Debugger.Log(), như lấy từ Nguồn tham khảo:

// Posts a message for the attached debugger. If there is no 
// debugger attached, has no effect. The debugger may or may not 
// report the message depending on its settings. 
[MethodImplAttribute(MethodImplOptions.InternalCall)] 
public static extern void Log(int level, String category, String message); 

Lưu ý rằng không có [Conditional] thuộc tính trên phương pháp này và nó mang [MethodImplAtttribute] thuộc tính. Điều đó có nghĩa là phương thức này thực sự được thực hiện trong CLR, được viết bằng mã C++.

Vì vậy, phương thức gọi sẽ được thực hiện, bất kể cấu hình. Bạn có thể tìm thấy việc thực hiện phương thức từ phân phối nguồn SSCLI20, clr/src/vm/debugdebugger.cpp. Nó sử dụng OutputDebugString(), một hàm winapi hiển thị các chuỗi trong trình gỡ lỗi, nếu có một chuỗi được đính kèm. Hoặc trong tiện ích như DbgView.exe của SysInternals. Nếu không có thì cuộc gọi api chỉ không làm bất cứ điều gì và nhanh chóng trả về. Bạn chỉ trả tiền cho cuộc gọi chức năng trên đầu, một số ít nano giây.

Không có bất cứ điều gì tốt để tối ưu hóa về cuộc gọi phương thức, nó sẽ thực hiện theo cùng một cách cho dù bạn xây dựng cấu hình Gỡ lỗi hay Phát hành. Có quyền truy cập vào thông tin gỡ lỗi trong phiên bản Xây dựng chắc chắn có thể hữu ích, bạn có thể quyết định xem đó có phải là tính năng bạn muốn tắt hay không. Cho dù những nano giây đó có ảnh hưởng quan sát được đối với chương trình của bạn hay không thì khó mà nói được. Đo lường, không giả định bất cứ điều gì.

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