7 Stimmen

Warum verringert ein bedingter Haltepunkt die Ausführungsgeschwindigkeit der Anwendung zur Debugging-Zeit?

Wenn ich einen bedingten Haltepunkt in VS2005 verwende, anstatt temporären Code zu verwenden, um bestimmte Bedingungen zu überprüfen, habe ich festgestellt, dass es mehr Zeit in Anspruch nimmt und die Ausführungsgeschwindigkeit verringert wird!!! Wissen Sie, warum? und wie man dieses Problem zu lösen?

Beispiel:

    int sequence = atoi(m_SequenceNumber.GetAscii());
    if( sequence == 392914)//temporary code to check to step into code
    {
        int x = 0;//I put breakpoint here
    }

Der vorherige Code wird schneller ausgeführt, als wenn ich einen bedingten Haltepunkt mit ( sequence == 392914) verwende.

5voto

1800 INFORMATION Punkte 125009

Es ist besser (wenn möglich), einen Speicherüberwachungspunkt zu verwenden als einen bedingten Haltepunkt. Ein bedingter Haltepunkt muss (wie bereits erwähnt) jedes Mal, wenn der Ausführungszeiger diesen Punkt überschreitet, zusätzlichen Code ausführen, um festzustellen, ob er abbricht oder nicht - das kostet natürlich zusätzliche Zeit. Ein Speicher-Watchpoint eines bestimmten Typs kann bestimmte spezielle Hardware-Register verwenden - es gibt eine Grenze, wie viele Watchpoints Sie setzen können, die beschleunigt werden können, aber wenn Sie sie verwenden können, gibt es fast keine Geschwindigkeitseinbußen.

Mit dem Haltepunktfenster wird ein Speicher-Watchpoint gesetzt. Sie setzen ihn nicht auf eine Codezeile, sondern auf eine Adresse im Speicher. Daraus ergibt sich die offensichtliche Einschränkung, dass er nur für Dinge funktioniert, deren Adresse Sie tatsächlich übernehmen können, wie z.B. globale Variablen und dynamisch zugewiesene Speicherbereiche (mit new usw.). Sie sind in der Menge des Speichers, den Sie beobachten dürfen, begrenzt (je nach CPU bekommen Sie wahrscheinlich mehr oder weniger Spezialregister zugewiesen).

Ich sitze gerade nicht vor VS, aber grob gesagt, klicken Sie mit der rechten Maustaste in das Haltepunktfenster und wählen Sie so etwas wie "neuer Datenhaltepunkt". Sie geben dann die Adresse des Speichers und die Größe in Bytes ein. Wann immer sich der Wert ändert, wird Ihr Haltepunkt ausgelöst. Dies ist besonders nützlich, um Probleme mit beschädigtem Speicher herauszufinden.

3voto

Eric Schoonover Punkte 45504

Ich habe in dieses Problem in der Vergangenheit als auch laufen und nie wirklich einen Weg, um weiterhin mit bedingten Haltepunkte innerhalb einer großen Schleife ohne Auswirkungen auf die Leistung gefunden. Ich habe gelernt, dass man einen temporären Code wie diesen einfügen kann, der die Leistung nicht beeinträchtigt und VS zum Abbruch veranlasst (gleiches Verhalten wie ein bedingter Haltepunkt).

if ( condition ) Debugger.Break();

2voto

Michael Burr Punkte 320591

Überlegen Sie, wie Sie einen bedingten Haltepunkt implementieren würden, wenn Sie einen Debugger schreiben würden. Der Debugger hat nur dann die Möglichkeit, die Bedingung zu bewerten, wenn der Haltepunkt erreicht wird. Obwohl der Haltepunkt aus Ihrer Sicht bedingt ist, wird er aus Sicht des Prozessors jedes Mal getroffen, wenn die Anweisung ausgeführt wird. Der Debugger übernimmt die Kontrolle und tut Folgendes:

  • bestimmt, dass der Haltepunkt bedingt ist
  • wertet den Ausdruck
  • wenn der Ausdruck falsch ist, setzt der Debugger die Ausführung fort
  • Andernfalls übergibt der Debugger die Kontrolle an Sie

Selbst wenn Sie den Haltepunkt nie sehen (weil die Bedingung nicht erfüllt ist), kann der Debugger den Haltepunkt erfassen und die Bedingung Tausende von Malen pro Sekunde (oder vielleicht noch öfter) auswerten.

0voto

Brian Rasmussen Punkte 112118

Ich nehme an, das liegt daran, dass die Ausführung der Bedingung Zeit in Anspruch nimmt. Es ist immer noch viel schneller als manuell die notwendige Anzahl von Schritten hart.

0voto

Benoît Punkte 16390

Hinzugefügter temporärer Code kann vom Compiler (zumindest ein wenig) optimiert werden. Der bedingte Haltepunkt springt wahrscheinlich zu einem Visual-Studio-Code, der manuell die benötigten Informationen abruft, um zu wissen, ob er tatsächlich eine Pause machen muss oder nicht.

Das würde irgendwie erklären, warum es mehr Zeit braucht. Aber das ist nur eine Vermutung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X