2012-06-11 40 views

回答

5

沒有任何一種優化對呼叫RELEASE模式。

該呼叫存在於IL。唯一的區別是,如果不存在DEBUGGER,則它不起作用。

從技術文檔Debugger.Log

如果沒有附加的調試器,此方法沒有效果。

我會建議測量您的應用程序的性能,然後選擇遵循的步驟。

如果沒有顯着差異(從您的應用程序的角度來看),我會保持原樣。

通過這種方式,在需要的時刻,你可以連接到你的應用程序與調試器,讓你可能需要從日誌中,作爲Debugger.Log將在點工作的消息。

0

以下代碼的快速測試(.NET 4,推出,在任何CPU)

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

產生此IL

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

正如你可以看到有向Debugger.Log NO呼叫。

1

這是Debugger.Log()的聲明,如從參考源檢索到:

// 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); 

注意,有上的方法沒有[條件]屬性和它所攜帶的[MethodImplAtttribute]屬性。這意味着該方法實際上是在用C++代碼編寫的CLR中實現的。

所以方法調用作出,不管配置如何。您可以從SSCLI20源代碼發行版clr/src/vm/debugdebugger.cpp中找到該方法的實現。它使用OutputDebugString(),這是一個winapi函數,它在調試器中顯示字符串(如果已連接)。或者像SysInternals的DbgView.exe這樣的工具。如果兩者都不存在,那麼api調用就不會做任何事情並很快返回。您只需支付幾納秒的函數調用開銷。

對於方法調用沒有任何好的方法可以優化,無論您構建調試還是發佈配置,它都會以相同的方式執行。有權訪問Release版本中的調試信息當然可以得心應手,您可以自行決定是否需要關閉該功能。很難說這些納秒是否對您的程序有可觀察的影響。衡量,不要假設任何事情。

相關問題