Frage

Einige der Plattformen, die ich entwickeln auf, haben keine Werkzeuge Profilierung. Ich suche nach Anregungen / Techniken, die Sie persönlich verwendet haben, um Sie Hotspots zu identifizieren, ohne die Verwendung eines Profilers.

Die Zielsprache ist C ++.

Ich bin interessiert, was Sie persönlich in Anspruch genommen haben.

War es hilfreich?

Lösung

Ich habe festgestellt, die folgende recht nützlich:

#ifdef PROFILING
# define PROFILE_CALL(x) do{ \
    const DWORD t1 = timeGetTime(); \
    x; \
    const DWORD t2 = timeGetTime(); \
    std::cout << "Call to '" << #x << "' took " << (t2 - t1) << " ms.\n"; \
  }while(false)
#else
# define PROFILE_CALL(x) x
#endif

, die in der Aufruffunktion als solche verwendet werden kann:

PROFILE_CALL(renderSlow(world));
int r = 0;
PROFILE_CALL(r = readPacketSize());

Andere Tipps

Kein Witz: Zusätzlich zu Dumping Timings std :: cout und anderem Text / Daten-orientierte Ansätze, die ich auch die Beep () Funktion verwenden. Es gibt etwas, über das Hören, die Lücke der Stille zwischen zwei „Beep“ Checkpoints, die eine andere Art von Eindruck macht.

Es ist wie der Unterschied zwischen in einer schriftlichen Noten suchen, und das Hören tatsächlich die Musik. Es ist wie der Unterschied zwischen rgb Lesung (255,0,0) und zu sehen, feuerrot.

So, jetzt habe ich eine Client / Server-Anwendung und mit Pieptöne verschiedener Frequenzen, Markierung, wo der Client die Nachricht sendet, wo der Server seine Antwort beginnt, beendet seine Antwort, wobei Antwort zuerst den Client eingibt, etc, ich kann sehr natürlich ein Gefühl dafür bekommen, wo die Zeit verbracht wird.

Im Wesentlichen, wenn ein Profilierungswerkzeug nicht verfügbar ist, zu emulieren, was ein Profiler getan hätte. Sie fügen Zähler in Funktionen denken, Sie sind interessant und zählen, wie oft und möglicherweise mit dem, was Größe / Art von Argumenten sie genannt werden.

Wenn Sie den Zugriff auf alle Timer auf Ihrer Plattform haben, können Sie diese am Anfang / Ende Start / Stopp der Funktionen der Ausführungszeit Informationen sowie zu bekommen, wenn diese aus dem Code ist unklar. Das wird Ihnen das meiste für Ihr Geld in komplexem Code geben, da es in der Regel zu viele Funktionen sein wird, sie alle zu Instrument. Stattdessen können Sie den Zeitaufwand in bestimmten Abschnitten des Codes erhalten durch einen Timer zu jedem widmen.

Diese beiden Techniken im Tandem kann einen iterativen Ansatz bilden, in dem Sie den breiten Abschnitt von Code finden, der den größten Teil Ihrer Zyklen mit Timer verbraucht, dann Instrument einzelne Funktionen mit einer feineren Granularität auf das Problem zu schärfen.

Wenn es etwas ausreichend lange Dauer (zB eine Minute oder mehr) ist, laufe ich die Software in einem Debugger dann ein paar Mal brechen und sehen, wo die Debugger brechen, ergibt dies eine sehr grobe Vorstellung davon, was die Software auf (wenn Sie 10-mal zB brechen und sie sind alle an der gleichen Stelle, das sagt etwas interessant!). Sehr rau und fertig, aber erfordert keine Werkzeuge, Instrumente usw.

Ich bin mir nicht sicher, welche Plattformen Sie im Sinne hatten, sondern auf Embedded-Mikrocontroller, ist es manchmal hilfreich, um eine Ersatz digitale Ausgangsleitung twiddle und misst die Pulsbreite mit einem Oszilloskop, Zähler / Timer oder Logikanalysator.

würde ich die 80/20 Regel verwenden und Timer um Hotspots oder interessante Anrufpfade setzen. Sie sollten eine allgemeine Vorstellung haben, wo die Engpässe (oder zumindest eine Mehrheit der Ausführungspfade) sein wird, und verwenden Sie die entsprechende Plattform abhängig hochauflösende Timer (QueryPerformanceCounters, gettimeofday usw.).

ich in der Regel nicht die Mühe, mit allem, was beim Start oder Herunterfahren (nur bei Bedarf) und haben wird gut „Engstellen“ definiert, in der Regel Nachricht oder irgendeine Art von algorithmischer Berechnung übergeben. Ich habe festgestellt, dass im Allgemeinen Nachricht sinkt / SRCs (sinkt moreso), Warteschlangen mutexes und einfach nur Chaos-ups (Algorithmen, Schleifen) in der Regel machen die meisten der Latenz in einem Ausführungspfad.

Sind Sie Visual Studio verwenden?

Das können Sie die / Gh und / GH Schalter verwenden. Hier ist ein Beispiel Einbeziehung Stapel Inspektion

Diese Flags können Sie von einer Datei-für-Datei-Basis, auf undecorated Funktionen registrieren, die jedes Mal, wenn eine Methode aufgerufen werden eingegeben und / oder in der Laufzeit verlassen.

Sie können dann alle Zeiten registrieren Profilinformationen, nicht nur Timing-Informationen. Stack-Dumps, ruft Adresse, Absenderadresse, usw., was wichtig ist, weil Sie wissen wollen, dass ‚Funktion X verwendet Y Zeit unter Funktion Z‘ und nicht nur die Gesamtzeit, in der Funktion X ausgegeben.

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