Ist es notwendig, Anrufe in Debugger.Log()
in der #if (DEBUG)
Präprozessordirektive zum Zweck der Codeoptimierung einzubinden, oder wird der C# -Compiler beim Erstellen der RELEASE
-Konfiguration noch optimierten Code erzeugen?Sollte ich Aufrufe von Debugger.Log() in #if (DEBUG) umbrechen?
Antwort
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.
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.
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.
- 1. #ifdef DEBUG versus #if DEBUG
- 2. #if debug -> #if myOwnConfig?
- 3. Wenn #if DEBUG läuft
- 4. Delphi #IF (DEBUG) Äquivalent?
- 5. "#if DEBUG" in einer ASPX/ASCX-Seite
- 6. Wie verwendet man #IF DEBUG in VB.NET
- 7. Sollte ich die Debug-Klasse in .net verwenden?
- 8. Sollte ich meine RPC-Aufrufe über HTTP RESTify?
- 9. Was genau sollte PROTECT bei der Zuweisung umbrechen?
- 10. #if Präprozessordirektive für Richtlinien, als DEBUG
- 11. Wie kann ich Knopftext in Opera umbrechen?
- 12. #if DEBUG und Rückrechnung - Unreachable Code Warnung
- 13. Sollte ich Code in Try Catch-Blöcke für Javascript immer umbrechen?
- 14. autoconf: sollte ich immer AS_IF über if und m4_if verwenden?
- 15. Erzwingen von Überschriften zum Umbrechen in HTML
- 16. Umbrechen von Text in HTML Option
- 17. Auf welches HTML-Element sollte ich ng-if setzen?
- 18. ASP.MVC Ansicht Kraftspender #IF DEBUG in Release Konfiguration
- 19. Debug für eine if-Anweisung in Access 2013
- 20. Sollte ich Shell-Argumente in Perl entkommen?
- 21. Mit welchem Delphi-Code sollte ich meine Aufrufe der veralteten TThread-Methode Suspend ersetzen?
- 22. Wie kann ich die x & y-Achse in SpriteKit umbrechen?
- 23. Positionsparameter in If-Bedingung funktioniert nicht wie es sollte
- 24. Wie kann ich BOOST in einem separaten Namespace umbrechen?
- 25. Schreiben von CSS für Element zum Umbrechen
- 26. Wie kann ich Aufrufe von Dir # [] in Ruby kombinieren?
- 27. Wie kann ich Attribute in C# bedingt aktivieren? „#if DEBUG“ funktioniert nicht
- 28. Wie gebe ich "if" in einer if-Schleife zurück?
- 29. Gibt es ein #IF DEBUG für Asp.net Markup?
- 30. Wie kann ich eine Zeichenfolge in Perl umbrechen?