Frage

Nachdem ich ein wenig Zeit damit verbracht hatte, sich zu fragen, warum meine App ein bestimmtes Szenario sehr langsam mit dem angeschlossenen Debugger ausführte, stellte ich fest, dass dies an einem bedingten Haltepunkt (dessen Zustand nie erfüllt wurde) zurückzuführen war. Dies erscheint vernünftig, da die CPU den Haltepunkt und VS signalisieren würde, dass die Bedingung vor der Ermöglichung der Ausführung fortgesetzt werden muss. Diese Übergänge müssen kostspielig sein.

Ich gehe davon aus, dass ein Haltepunkt in einem nicht ausgeführten Codepfad keine Laufzeit -Auswirkungen hat.

Meine Frage ist also zweifach:

  1. Gibt es Ressourcen, die die mit bedingten Haltepunkten verbundenen Kosten quantifizieren können. Wenn ja, kann es etwas tun, um ihre Laufzeitbewertungskosten zu senken?
  2. Gibt es Kosten, die mit einem "deaktivierten" Haltepunkt verbunden sind? Mit deaktiviert meine ich, dass VS den Haltepunktmarker in der Rinne mit einem hohlen Kreis anzeigt.

Wenn etwas, das ich oben erwähnt habe, ist natürlich keinen Sinn, dann weisen Sie mich bitte in die richtige Richtung.

War es hilfreich?

Lösung

Es ist schwierig, die Kosten eines bedingten Haltepunkts zu quantifizieren. Der Ausdruck in einem bedingten Haltepunkt wird unter Verwendung der genauen Semantik bewertet, als hätten Sie ihn in das Uhren oder das unmittelbare Fenster eingegeben. Ausdrücke dieser Art werden im Client -Programm nicht tatsächlich ausgeführt, sondern von dem sprachspezifischen Ausdrucksbewerter behandelt. Es ist nicht wirklich möglich, diese Art von Bewertungen auf sinnvolle Weise zu profilieren.

Ich kann jedoch ein paar Dinge auflisten, die in einem Debug -Fenster -Evaler als langsamer sind

  • Funktionsaufrufe: Sie sind das langsamste, was Sie tun können, da der Funktionsaufruf erforderlich ist
  • String -Vergleich: Unter der Motorhaube gehen diese zurück zu den Funktionen Evals

NEIN beeinflussen nicht, dass behinderte Haltepunkte das Ausführen der Anwendung beeinflussen.

Andere Tipps

Eine Sache, auf die Sie achten sollten (was ich auf die harte Tour gelernt habe), ist sicherzustellen

Der Breakpoint -Editor warnt Sie nicht, aber wenn der Haltepunkt bewertet wird, wird die Variable geändert! Ich habe eine Weile gebraucht, um meinen Code mit diesem zu debuggen!

Auch wenn ich den bedingten Haltepunkt für Bebug Code wirklich brauche; Ich füge die Bedingung dem Code hinzu und füge dann etwas wie String Stop = "HIER" hinzu; Und geben Sie dort einen normalen Haltepunkt ein - ich finde, der Code wird dann schneller ausgeführt.

Ich habe etwas dort gelesen, dass es für diese Haltepunkte Hardware -Unterstützung gibt, so dass die Verwendung weniger als x bedingte Haltepunkte einer bestimmten Art im Wesentlichen kostenlos ist, aber darüber muss es jedoch mehr Software verwenden. (OTOH, das war für native Apps, nicht sicher über diese neuen Jit -Dinge.)

Behinderte Haltepunkte sollten überhaupt beeinflussen, sie lassen nur einige Speicher- und GUI -Ressourcen in der IDE.

Ich habe auch bemerkt, dass bedingte Haltepunkte teuer sind und zu dem gleichen Schluss gekommen sind wie Sie. Ich kann mir keinen Grund vorstellen, warum ein behinderter Haltepunkt eine Verlangsamung verursachen würde, da ich erwarten würde, dass er nur ein Editor ist.

Was ich tue, wenn ich in einer Situation wie deine bin, ist ein Assert -Makro. (du kannst den ... benutzen behaupten Makro, das Visual Studio bietet, aber ich mag es nicht). Lassen Sie Ihr Makro den gewünschten Zustand überprüfen und rufen Sie anschließend an Debugbreak Wenn es fehlschlägt. Lassen Sie in der Realase oder nicht überprüften Aufbau Ihrer Bewerbung geltend gemacht, sodass Ihr Code nicht beeinflusst wird.

Ein einfaches Assert -Makro kann aussehen:

#ifdef _DEBUG
#define assert(x)\
do{\
  if(!(x)){DebugBreak();}\
}while(0)
#else
#define assert(x)
#endif

und nenn es wie:

assert(pValue != NULL && "A bad parameter was passed to the function");

Sie können mehr Code in den Fehler vor dem Debugbreak einfügen (z. B. das Ausdrucken der Bedingung, die mit #X fehlgeschlagen ist, und/oder die Zeilen-/Dateinummer mit ____File____ und ____Line____, damit Sie auf die Nachricht klicken können). Sie können Nachrichten an das Debug -Protokoll schreiben Outputdebugstring und überprüfen Sie sogar, ob ein Debugger beigefügt ist Isdebuggerpresent Um Ihre Behauptung noch mehr anzupassen. Ich benutze auch gerne das && String -Format, um ein bisschen mehr Informationen über die jeweilige Behauptung zu geben.

Es gibt einige Dinge, auf die Sie bei der Verwendung von Assert vorsichtig sind. Geben Sie zunächst keinen Code ein, der in das Makro ausgeführt werden muss, da er in einem Nicht -Debug -Build ausgezogen wird. Geben Sie aus den gleichen Gründen keinen Code ein, der Nebenwirkungen hat. Außerdem möchten Sie Debugbreak () nicht anrufen, wenn ein Debugger nicht angehängt wird, da er im Wesentlichen eine Ausnahme ausgelöst hat, die die Anwendung beendet, wenn sie nicht gefangen werden.

  1. Setzen Sie den Haltepunkt in Ihren Code ein, um die Leistung zu testen. Z.B

    Stopwatch st = new Stopwatch();
    st.Start();
    if(my condition)
    {
      st.Stop();
      Debugger.Break();
    }
    

    Nein, nicht genau das gleiche, aber nah genug.

  2. Nein - Im ausführenden Programm ist kein Behinderungspunkt vorhanden. Es wird nur für Ihre Bequemlichkeit im VS -Metadaten aufbewahrt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top