2012-06-11 5 views

Antwort

5

Es ist nicht jede Art der Optimierung auf diesen Aufruf in RELEASE Modus.

Der Anruf ist in IL vorhanden. Der einzige Unterschied ist, dass es keinen Effekt hat, wenn kein DEBUGGER vorhanden ist.

Von Dokumentation Debugger.Log:

Wenn kein Debugger angeschlossen ist, hat diese Methode keine Auswirkungen.

Ich würde vorschlagen, die Leistung Ihrer App zu messen und danach die Schritte zu folgen.

Wenn es keinen signifikanten Unterschied (aus der Sicht Ihrer App) gibt, würde ich dieses Protokoll so lassen, wie es ist.

Auf diese Weise im Moment der Notwendigkeit, können Sie Ihre App mit Debugger anhängen und erhalten Nachrichten, die Sie aus dem Protokoll benötigen könnten, wie Debugger.Log bei dass Punkt funktionieren würde.

0

Ein schneller Test des folgenden Codes (.NET 4, Veröffentlichung, Any CPU)

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

produziert dieses IL

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

Wie Sie Anruf gibt es zum Debugger.Log sehen können.

1

Dies ist die Erklärung für Debugger.Log(), wie aus der Referenzquelle abgerufen:

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

Beachten Sie, dass es für das Verfahren nicht [Conditional] Attribut ist und dass es trägt die [MethodImplAtttribute] Attribut. Das bedeutet, dass die Methode tatsächlich in der CLR implementiert und in C++ - Code geschrieben ist.

So der Methodenaufruf wird gemacht werden, unabhängig von der Konfiguration. Sie finden die Implementierung der Methode in der SSCLI20-Quelldistribution, clr/src/vm/debugdebugger.cpp. Es verwendet OutputDebugString(), eine winapi-Funktion, die Strings im Debugger anzeigt, wenn einer angehängt ist. Oder in einem Dienstprogramm wie SysInternals DbgView.exe. Wenn keine vorhanden ist, dann tut der API-Aufruf einfach nichts und kehrt schnell zurück. Sie zahlen nur für den Funktionsaufruf-Overhead, eine Handvoll Nanosekunden.

Es gibt nichts Anständiges über den Methodenaufruf zu optimieren, es wird auf die gleiche Weise ausgeführt, ob Sie die Debug- oder die Release-Konfiguration erstellen. Der Zugriff auf Debug-Informationen im Release-Build kann sicherlich hilfreich sein. Es liegt an Ihnen, ob Sie diese Funktion deaktivieren möchten. Ob diese Nanosekunden einen sichtbaren Einfluss auf Ihr Programm haben, ist schwer zu sagen. Messen Sie, nehmen Sie nichts an.

Verwandte Themen