Có cần phải gọi các cuộc gọi đến Debugger.Log()
trong chỉ thị tiền xử lý #if (DEBUG)
cho mục đích tối ưu hóa mã hay trình biên dịch C# vẫn tạo mã được tối ưu hóa khi xây dựng cấu hình RELEASE
?Tôi có nên gọi các cuộc gọi đến Debugger.Log() trong #if (DEBUG) không?
Trả lời
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.
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
.
Đâ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ì.
- 1. Tôi có cần gọi các cuộc gọi MessageBox không?
- 2. php - Tôi có nên gọi exit() sau khi gọi đến Location: header không?
- 3. Ghi đè màn hình cuộc gọi đến?
- 4. Kêu gọi các cuộc gọi để gỡ lỗi() trong if isDebugEnabled(): một chính sách tốt?
- 5. Có thể trong android để ghi âm cuộc gọi trong khi gọi đến hoặc gọi đi
- 6. Có thể gọi phương thức có tên trong cuộc gọi đến đâu không?
- 7. Tôi có nên khôi phục các cuộc gọi RPC của mình qua HTTP không?
- 8. Chặn cuộc gọi đến console.log trong Chrome
- 9. Tôi có nên tính toán tiền trong Javascript hoặc như một cuộc gọi AJAX không?
- 10. không có chức năng phù hợp cho cuộc gọi đến ''
- 11. Phát hiện cuộc gọi đến trong Lync
- 12. Tôi có nên sử dụng Từ khóa cuộc gọi trong VB/VBA không?
- 13. Tôi có nên thực hiện các cuộc gọi nhỏ hơn, thường xuyên hơn hay không; hoặc các cuộc gọi lớn hơn thường xuyên hơn?
- 14. Khi nào tôi nên sử dụng cuộc gọi() vs gọi hàm trực tiếp?
- 15. Tại sao không có cuộc gọi đến nhà xây dựng?
- 16. Cuộc gọi đến toán tử 'xóa' có đồng bộ không?
- 17. Các cuộc gọi đến các phương thức Javascript có an toàn hoặc đồng bộ hóa không?
- 18. Cuộc gọi lạ đến modelIdentifierForElementAtIndexPath: inView: (UIDataSourceModelAssociation)
- 19. Có thể kết hợp các cuộc gọi trong WCF không?
- 20. try-lock cuộc gọi mutex và các cuộc gọi CAS
- 21. màn hình cuộc gọi đến android
- 22. Cuộc gọi Mac không có giấy tờ
- 23. Lỗi: "Cuộc gọi đến mailbox_fql đã vượt quá 300 cuộc gọi mỗi 600 giây"
- 24. Khi #if DEBUG chạy
- 25. Cách tắt tiếng cuộc gọi đến
- 26. Tôi có nên nhận xét các cuộc gọi đăng nhập khi tạo gói cuối cùng của mình không?
- 27. Tránh lặp lại các cuộc gọi đến Nội suy
- 28. chức năng gọi lỗi, [Cuộc gọi đến chức năng PInvoke không cân bằng chồng]
- 29. Nên nếu gọi SqlDataReader.HasRows nếu tôi đang gọi SqlReader.Read
- 30. Không có sự kiện đổ chuông khi có cuộc gọi đến