2016-07-31 12 views
0

Das Ausführen von .exe das Vorhandensein der Debug.WriteLine() Effekte Leistung 8x.
Wie kann eine Debug-Anweisung die Leistung nicht im Debug-Modus beeinflussen?
Wie kann ich eine Debug nicht Auswirkungen .exe Leistung haben?
counterRequals ist nach referenziert, so dass es nicht einfach überspringen kann.
Dies ist, wenn es über 1 Milliarde Mal getroffen wird.Debug.WriteLine, die nicht Debug-Leistung bewirkt

if (innerInnerLoopCount > 1 && r == innerInnerLoopCount) 
{ 
    counterRequals++; 
    Debug.WriteLine(""); 
} 
+6

'Debug-Mitglieder haben ihnen die [ConditionalAttribute] (http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx) zugewiesen, so dass sie in' Release nicht vorhanden sind 'Modus. Es hört sich so an, als würden Sie den 'Debug'-Build ohne den Debugger ausführen. Wenn Sie die 'Debug'-ähnliche Funktionalität benötigen, sollten Sie stattdessen die Klasse [Trace] (https://msdn.microsoft.com/en-us/library/system.diagnostics.trace (v = vs.110) .aspx) verwenden Sie werden möglicherweise Perf-Probleme mit 1 Milliarde Treffer treffen. Könnte [EventSource] berücksichtigen (https://msdn.microsoft.com/en-us/library/system.diagnostics.tracing.eventsource.aspx) – keyboardP

+3

Nur weil Sie nicht debuggen bedeutet nicht, dass Sie nicht kompilieren im Debug-Modus. Haben Sie im Debug- oder Release-Modus kompiliert? – sstan

+1

Der Operator && ist teuer, wenn der Ausdruck des linken Operators schlecht vorhersehbar ist, kann die Verzweigungsvorhersage den Vorgang bis zu etwa 5 Mal so langsam machen. Multiplizieren Sie das mit einer Milliarde und Sie haben ungefähr 2 Sekunden, um nichts Nützliches zu tun. Tausche die Operanden aus. Und * tu * bevorzuge die schnelle Version, die überhaupt keine Verzweigung verwendet: 'if (r == innerInnerLoopCount & innerInnerLoopCount> 1)' –

Antwort

1

Debug Mitglieder haben die ConditionalAttribute ihnen zugewiesen, so dass sie in Release Modus nicht vorhanden sein wird. Es klingt wie Sie die Debug Build ohne den Debugger ausführen. Wenn Sie Debug-ähnliche Funktionen benötigen, sollten Sie stattdessen Trace class verwenden, obwohl Sie möglicherweise Perf-Probleme mit 1 Milliarde Treffer haben. Wenn das der Fall ist, können Sie sich EventSource anschauen, was eine Protokollierung mit hoher Leistung ermöglicht.