Beyond Stack Sampling: C ++ - Profiler


146

Eine Hacker-Geschichte

Das Datum ist der 12.02.10. Die Tage vor Weihnachten sind vorbei und ich habe als Windows-Programmierer so ziemlich eine große Straßensperre getroffen. Ich habe AQTime verwendet, ich habe versucht, schläfrig, glänzend und sehr schläfrig zu sein, und während wir sprechen, wird VTune installiert. Ich habe versucht, den VS2008-Profiler zu verwenden, und er war sowohl positiv als auch oft unempfindlich. Ich habe die Technik der zufälligen Pause verwendet. Ich habe Rufbäume untersucht. Ich habe Funktionsspuren abgefeuert. Aber die traurige, schmerzhafte Tatsache ist, dass die App, mit der ich arbeite, mehr als eine Million Codezeilen umfasst, wahrscheinlich auch Apps von Drittanbietern im Wert von einer weiteren Million Zeilen.

Ich brauche bessere Werkzeuge. Ich habe die anderen Themen gelesen. Ich habe jeden in jedem Thema aufgeführten Profiler ausprobiert. Es muss einfach etwas Besseres geben als diese unkonventionellen und teuren Optionen oder lächerliche Mengen an Arbeit, die fast keinen Gewinn bringen. Um die Sache noch weiter zu verkomplizieren, ist unser Code stark mit Threads versehen und führt eine Reihe von Qt-Ereignisschleifen aus, von denen einige so zerbrechlich sind, dass sie aufgrund von Zeitverzögerungen unter starker Instrumentierung abstürzen. Fragen Sie mich nicht, warum wir mehrere Ereignisschleifen ausführen. Niemand kann es mir sagen.

Gibt es in einer Windows-Umgebung weitere Optionen nach dem Vorbild von Valgrind?
Gibt es etwas Besseres als den langen Schwad kaputter Werkzeuge, die ich bereits ausprobiert habe?
Gibt es etwas, das für die Integration in Qt entwickelt wurde, möglicherweise mit einer nützlichen Anzeige von Ereignissen in der Warteschlange?

Eine vollständige Liste der Tools, die ich ausprobiert habe, mit denen, die in Kursivschrift wirklich nützlich waren:

  • AQTime: Ziemlich gut! Hat einige Probleme mit der tiefen Rekursion, aber das Anrufdiagramm ist in diesen Fällen korrekt und kann verwendet werden, um eventuelle Verwirrungen zu beseitigen. Kein perfektes Werkzeug, aber einen Versuch wert. Es könnte Ihren Bedürfnissen entsprechen, und es war sicherlich die meiste Zeit gut genug für mich.
  • Random Pause-Angriff im Debug-Modus: Nicht genügend Informationen zur Zeit.
    Ein gutes Werkzeug, aber keine vollständige Lösung.
  • Parallel Studios: Die nukleare Option. Aufdringlich, seltsam und verrückt mächtig. Ich denke, Sie sollten die 30-Tage-Bewertung treffen und herausfinden, ob sie gut passt. Es ist auch verdammt cool.
  • AMD Codeanalyst: Wunderbar, einfach zu bedienen, sehr absturzanfällig , aber ich denke, das ist eine Umgebungssache. Ich würde empfehlen, es zu versuchen, da es kostenlos ist.
  • Luke Stackwalker: Funktioniert gut bei kleinen Projekten, es ist ein bisschen versucht, es bei uns zum Laufen zu bringen. Einige gute Ergebnisse, und es ersetzt definitiv Sleepy für meine persönlichen Aufgaben.
  • PurifyPlus: Keine Unterstützung für Win-x64-Umgebungen, vor allem Windows 7. Ansonsten ausgezeichnet. Einige meiner Kollegen in anderen Abteilungen schwören darauf.
  • VS2008 Profiler: Erzeugt eine Ausgabe im Bereich von über 100 Gigs im Funktionsablaufverfolgungsmodus mit der erforderlichen Auflösung. Positiv zu vermerken ist, dass solide Ergebnisse erzielt werden.
  • GProf: Erfordert, dass GCC auch nur mäßig effektiv ist.
  • VTune: Die W7-Unterstützung von VTune grenzt an Kriminelle. Ansonsten hervorragend
  • PIN: Ich müsste mein eigenes Tool hacken, das ist also ein letzter Ausweg.
  • Sleepy \ VerySleepy: Nützlich für kleinere Apps, aber hier scheitert ich.
  • EasyProfiler: Nicht schlecht, wenn Ihnen ein bisschen manuell eingefügter Code nichts ausmacht, um anzugeben, wo das Instrument eingesetzt werden soll.
  • Valgrind: * nur nix, aber sehr gut, wenn Sie in dieser Umgebung sind.
  • OProfile: Nur Linux.
  • Proffy: Sie schießen wilde Pferde.

Vorgeschlagene Tools, die ich nicht ausprobiert habe:

  • XPerf:
  • Glowcode:
  • Devpartner:

Anmerkungen: Intel-Umgebung im Moment. VS2008, Boost-Bibliotheken. Qt 4+. Und der elende Hummel von allen: Qt / MFC-Integration über Trolltech.


Jetzt: Fast zwei Wochen später scheint mein Problem behoben zu sein. Dank einer Vielzahl von Tools, darunter fast alles auf der Liste und einige meiner persönlichen Tricks, haben wir die primären Engpässe gefunden. Ich werde jedoch weiterhin neue Profiler und neue Technologien testen, erforschen und ausprobieren. Warum? Weil ich es euch schulde, weil ihr rockt. Es verlangsamt zwar die Zeitachse ein wenig, aber ich bin immer noch sehr aufgeregt, immer wieder neue Tools auszuprobieren.

Synopsis
Neben vielen anderen Problemen wurde kürzlich eine Reihe von Komponenten auf das falsche Threading-Modell umgestellt, was zu schwerwiegenden Problemen führte, da der Code unter uns plötzlich nicht mehr multithreaded war. Ich kann nicht mehr sagen, weil es gegen meine NDA verstößt, aber ich kann Ihnen sagen, dass dies niemals durch gelegentliche Inspektion oder sogar durch normale Codeüberprüfung gefunden worden wäre. Ohne Profiler, Callgraphs und zufällige Pausen in Verbindung würden wir immer noch unsere Wut auf den wunderschönen blauen Bogen des Himmels schreien. Zum Glück arbeite ich mit einigen der besten Hacker zusammen, die ich je getroffen habe, und ich habe Zugang zu einem erstaunlichen Vers voller großartiger Werkzeuge und großartiger Leute.

Meine Herren, ich weiß das sehr zu schätzen und bedauere nur, dass ich nicht genug Repräsentanten habe, um jeden von Ihnen mit einem Kopfgeld zu belohnen. Ich denke immer noch, dass dies eine wichtige Frage ist, um eine bessere Antwort zu erhalten als die, die wir bisher auf SO haben.

Infolgedessen werde ich in den nächsten drei Wochen jede Woche das größte Kopfgeld aufbringen, das ich mir leisten kann, und es der Antwort mit dem nettesten Werkzeug zuweisen, von dem ich denke, dass es nicht allgemein bekannt ist. Nach drei Wochen haben wir hoffentlich ein endgültiges Profil der Profiler erstellt, wenn Sie meine List verzeihen.

Take-away
Verwenden Sie einen Profiler. Sie sind gut genug für Ritchie, Kernighan, Bentley und Knuth. Es ist mir egal, wer du denkst, dass du bist. Verwenden Sie einen Profiler. Wenn der, den Sie haben, nicht funktioniert, suchen Sie einen anderen. Wenn Sie keinen finden können, codieren Sie einen. Wenn Sie keinen codieren können oder es sich um ein kleines Auflegen handelt oder Sie einfach nicht weiterkommen, verwenden Sie eine zufällige Pause. Wenn alles andere fehlschlägt, stellen Sie einige Studenten ein, um einen Profiler herauszuholen.


Eine längere Sicht
Also dachte ich, es wäre vielleicht schön, eine Retrospektive zu schreiben. Ich habe mich für eine intensive Zusammenarbeit mit Parallel Studios entschieden, auch weil es tatsächlich auf dem PIN-Tool basiert. Nachdem ich mit einigen der beteiligten Forscher akademische Beziehungen hatte, war ich der Meinung, dass dies wahrscheinlich ein Qualitätsmerkmal war. Zum Glück hatte ich recht. Obwohl die GUI ein bisschen schrecklich ist, fand ich IPS unglaublich nützlich, obwohl ich es nicht jedem empfehlen kann. Kritisch gesehen gibt es keinen offensichtlichen Weg, um Trefferzahlen auf Zeilenebene zu erhalten, was AQT und eine Reihe anderer Profiler bieten, und ich habe es unter anderem als sehr nützlich empfunden, die Rate der Zweigauswahl zu untersuchen. Im Internet hat es mir auch Spaß gemacht, AQTime zu verwenden, und ich habe festgestellt, dass ihre Unterstützung sehr reaktionsschnell ist. Auch hier muss ich meine Empfehlung qualifizieren: Viele ihrer Funktionen funktionieren nicht so gut, und einige von ihnen sind unter Win7x64 geradezu absturzgefährdet. XPerf zeigte ebenfalls eine bewundernswerte Leistung, ist jedoch für die Abtastdetails, die erforderlich sind, um bei bestimmten Arten von Anwendungen gute Lesevorgänge zu erzielen, äußerst langsam.

Im Moment muss ich sagen, dass ich nicht glaube, dass es eine endgültige Option für die Profilerstellung von C ++ - Code in einer W7x64-Umgebung gibt, aber es gibt sicherlich Optionen, die einfach keinen nützlichen Dienst ausführen.


18
Haben Sie versucht, einen anderen Job zu bekommen? :)
Nikolai Fetissov

10
Wo sonst könnte ich Rätsel so schwer lösen? Ich denke, ich könnte zum Kernel-Hacking zurückkehren, aber das zahlt sich nicht so gut aus.
Jake Kurzer

3
@Kos Ich denke, damit gprof von Nutzen ist, müssen Sie das mit -pg kompilierte gcc-Toolset verwenden, sonst wird die Datei gprof.out nicht erstellt. Im Fall des OP klingt es so, als würde er msvc verwenden, was die Verwendung von gprof ausschließt. Andererseits glaube ich nicht, dass Gprof besser für ihn wäre, wenn die anderen auf der Liste seine Bedürfnisse nicht erfüllen
Urwolf

2
@Marc Gravell Das ist fair genug, nehme ich an ... Es scheint mir eine seltsame Heuristik zu sein, dass die am besten gepflegten Beiträge abrupt in die Community-Domäne übergehen und effektiv eine Situation erzeugen, in der Sie Ihre Frage oder Antwort umso mehr aktualisieren und pflegen , je weniger Sie in den Augen der gesamten Community von dieser Wartung profitieren. Soll ich das zu Meta bringen?
Jake Kurzer

2
Möchte jemand eine Retrospektive, wenn man bedenkt, was ich jetzt über Profiler weiß?
Jake Kurzer

Antworten:


65

Zuerst:

Zeitabtastprofiler sind robuster als CPU-Abtastprofiler. Ich bin mit Windows-Entwicklungstools nicht sehr vertraut, daher kann ich nicht sagen, welche welche sind. Die meisten Profiler sind CPU-Sampling.

Ein CPU-Abtastprofiler erfasst alle N Befehle eine Stapelverfolgung.
Diese Technik zeigt Teile Ihres Codes an, die CPU-gebunden sind. Was großartig ist, wenn das der Flaschenhals in Ihrer Anwendung ist. Nicht so toll, wenn Ihre Anwendungsthreads die meiste Zeit damit verbringen, sich um einen Mutex zu streiten.

Ein Zeitabtastungsprofiler erfasst alle N Mikrosekunden eine Stapelverfolgung.
Diese Technik wird sich auf Null konzentrieren "langsamen" Code. Ob die Ursache CPU-gebunden ist, E / A-gebunden, Mutex-gebunden oder Cache-Thrashing-Codeabschnitte blockiert. Kurz gesagt, welcher Code auch immer Ihre Anwendung verlangsamt, wird auffallen.

Verwenden Sie daher nach Möglichkeit einen Zeitabtastungs-Profiler, insbesondere beim Profilieren von Thread-Code.

Zweite:

Sampling-Profiler generieren Datenmengen. Die Daten sind äußerst nützlich, aber es gibt oft zu viel, um leicht nützlich zu sein. Ein Profildaten-Visualizer hilft hier enorm. Das beste Tool, das ich für die Visualisierung von Profildaten gefunden habe, ist gprof2dot . Lassen Sie sich nicht vom Namen täuschen, er verarbeitet alle Arten von Sampling-Profiler-Ausgaben (AQtime, Sleepy, XPerf usw.). Sobald die Visualisierung auf die störenden Funktionen hingewiesen hat, kehren Sie zu den Rohprofildaten zurück, um bessere Hinweise auf die eigentliche Ursache zu erhalten.

Das gprof2dot Werkzeug erzeugt einen Punkt Graph - Beschreibung , dass Sie dann einen Feed in graphviz Werkzeug. Die Ausgabe ist im Grunde ein Callgraph mit Funktionen, die durch ihre Auswirkung auf die Anwendung farblich gekennzeichnet sind. Alt-Text

Ein paar Tipps, um gprof2dot dazu zu bringen, eine schöne Ausgabe zu generieren.

  • Ich verwende einen --skewWert von 0,001 in meinen Diagrammen, damit ich die Hot-Code-Pfade leicht sehen kann. Ansonsten derint main() dominiert das den Graphen.
  • Wenn Sie mit C ++ - Vorlagen etwas Verrücktes machen, möchten Sie wahrscheinlich etwas hinzufügen --strip. Dies gilt insbesondere für Boost.
  • Ich verwende OProfile, um meine Stichprobendaten zu generieren. Um eine gute Ausgabe zu erhalten, muss sie so konfiguriert werden, dass die Debug-Symbole aus meinen Drittanbieter- und Systembibliotheken geladen werden. Stellen Sie sicher, dass Sie dasselbe tun, sonst werden Sie feststellen, dass CRT 20% der Zeit Ihrer Anwendung in Anspruch nimmt, wenn es wirklich darum mallocgeht, den Haufen zu zerstören und 15% zu verschlingen.

Obwohl ich nicht weiß, dass dies die vollständige Antwort auf meine Probleme ist, hat gprof2dot mein riesiges Arsenal betreten und nimmt schnell einen Lieblingsplatz ein. Ich denke, das ist eine Prämie wert!
Jake Kurzer

2
Ich habe diese Frage gestellt Linux Linux Sample Based Profiler . OProfile soll letztendlich die zeitbasierte Abtastung abrufen. Sie produzieren eine Ausgabe von sehr hoher Qualität. Sobald sie diese Funktion hinzugefügt haben, werde ich sie verwenden. Ansonsten hatte ich einen Freund, der eine GDB + Backtrace-Lösung für die Profilerstellung zusammenhackte. Sehr hackig, aber es hat den Engpass gefunden.
Deft_code

@deft_code: " Hacken Sie eine GDB + Backtrace-Lösung für die Profilerstellung zusammen. Sehr hackig, aber es hat den Engpass gefunden." Sie bestätigen mein ständiges Geschwätz :) Einige Leute möchten, dass die Profilerstellung hübsch ist, aber wenn die Ergebnisse das sind, was Sie brauchen, entscheiden Sie sich für das, was funktioniert, nicht für das, was hübsch ist .
Mike Dunlavey

Ich stimme Mike Dunlavey zu. Dinge wie XPerf / WPA sehen sehr hübsch und leistungsstark aus, aber es dauert eine Weile, herauszufinden, wie diese Tools verwendet werden, und am Ende des Tages ist das zufällige Anhalten so einfach und bietet bessere Informationen, um das Problem zu lösen. Mehr automatisierte Lösungen scheinen häufig kritische Informationen herauszufiltern, die zur Behebung des Engpasses erforderlich sind.
JDiMatteo

16

Was ist passiert, als Sie versucht haben, eine zufällige Pause einzulegen? Ich benutze es die ganze Zeit in einer Monster-App. Sie sagten, es habe nicht genügend Informationen gegeben, und Sie haben vorgeschlagen, eine hohe Auflösung zu benötigen. Manchmal brauchen die Leute ein wenig Hilfe, um zu verstehen, wie man es benutzt.

Unter VS konfiguriere ich die Stapelanzeige so, dass mir die Funktionsargumente nicht angezeigt werden, da dadurch die Stapelanzeige IMO völlig unlesbar wird.

Dann nehme ich ungefähr 10 Proben, indem ich während der Wartezeit auf "Pause" drücke . Ich benutze ^ A, ^ C und ^ V, um sie als Referenz in den Notizblock zu kopieren. Dann studiere ich jeden einzelnen, um herauszufinden, was zu diesem Zeitpunkt gerade erreicht wurde.

Wenn versucht wurde, mit 2 oder mehr Samples etwas zu erreichen, und dieses Ding nicht unbedingt erforderlich ist, habe ich ein Live-Problem gefunden, und ich weiß ungefähr, wie viel Korrektur es sparen wird.

Es gibt Dinge , die Sie nicht wirklich wissen müssen, wie präzise Prozent nicht wichtig sind, und was geht innerhalb 3rd-Party - Code ist nicht wichtig, weil man nichts tun kann diejenigen . Was Sie tun können, ist die Vielzahl von Call-Points im Code, die Sie verwenden können auf jedem Stapel Probe angezeigt modify. Das ist dein glückliches Jagdrevier.

Beispiele für Dinge, die ich finde:

  • Während des Startvorgangs kann es ungefähr 30 Ebenen tief sein, während versucht wird, internationalisierte Zeichenfolgen aus DLL-Ressourcen zu extrahieren. Wenn die tatsächlichen Zeichenfolgen geprüft werden, kann es leicht passieren, dass die Saiten nicht wirklich brauchen internationalisiert werden , um, wie sie sind Strings der Benutzer nie wirklich sieht.

  • Während der normalen Verwendung setzt ein Code unschuldig eine Modified-Eigenschaft in einem Objekt. Dieses Objekt stammt aus einer Superklasse, die die Änderung erfasst und Benachrichtigungen auslöst, die sich über die gesamte Datenstruktur erstrecken, die Benutzeroberfläche manipulieren und Objekte auf schwer vorhersehbare Weise erstellen und zerstören. Dies kann viel passieren - die unerwarteten Folgen von Benachrichtigungen.

  • Ausfüllen eines Arbeitsblatts Zeile für Zeile, Zelle für Zelle. Es stellt sich heraus, dass es viel schneller ist, wenn Sie die Zeile auf einmal aus einem Array von Werten erstellen.

PS Wenn Sie Multithread-fähig sind, werden beim Anhalten alle Threads angehalten. Schauen Sie sich den Aufrufstapel jedes Threads an. Wahrscheinlich ist nur einer von ihnen der wahre Schuldige, und die anderen sind untätig.


2
Bemerkungen? Bemerkungen? DAS IST SPARTA! Ich ... Entschuldigung, ich weiß nicht, woher das kommt. Nein, der Code lässt Klingon Opera lesbar aussehen und ist ungefähr so ​​gut dokumentiert. Eigentlich denke ich, dass es weit weniger dokumentiert ist ... Oh Gott.
Jake Kurzer

3
QTMFC-Integration? Oh toll, du bist kompliziert und böse geworden und hast noch nicht einmal den anwendungsspezifischen Code erreicht.
Ben Voigt

5
QT / MFC? Sollte das nicht mutierte Kinder mit 3 Köpfen hervorbringen, die hin und her schaukeln, während sie jede Idee nennen, die sie als die dümmste Idee aller Zeiten hören? Ähm ... ich schweife ab ... Wenn Sie eine der MFC-Socket-Klassen verwenden, schreiben Sie sofort Ihren Socket-Code und dann Ihr Profil neu. Es gibt VIELE Stellen im CSocket-Code, an denen die Message-Loop-Version von WaitForSingleObject verwendet wird, die die Leistung beeinträchtigt. Für mein Leben kann ich mich nicht an den Namen der
Wartefunktion

2
Oh Gott, vertrau mir, es ist genau so verrückt wie du denkst.
Jake Kurzer

3
@ Jake: Nicht viel Komfort, aber das ist der Ruhm der Turing-Universalität. Jede Sprache, egal wie hoch oder niedrig sie ist, ist in ihrer unbegrenzten Fähigkeit, missbraucht zu werden, gleichwertig.
Mike Dunlavey

8

Ich hatte einige Erfolge mit AMD CodeAnalyst .


Intel-Umgebung im Moment. Ich werde es aber im Hinterkopf behalten! :)
Jake Kurzer

4
@ Jake: Ich bin mir nicht sicher, was du dort meinst. AMD CodeAnalyst benötigt keine AMD-Chips. Es sollte auf den meisten x86- oder x64-Chips (auch bekannt als x86-64 / IA-64 / AMD64) funktionieren, einschließlich Intel-Chips.
Adam Rosenfield

1
Anscheinend bin ich Analphabet! Das sind wundervolle Neuigkeiten. Ich werde es morgen ausprobieren und die Frage aktualisieren.
Jake Kurzer

Bisher ist es sehr instabil, wenn mit den von mir benötigten Auflösungen gesampelt wird.
Jake Kurzer

@Adam: Ich habe kürzlich einen Code-Analysten auf einem Intel Pentium IV-Computer ausprobiert und er bot nur zeitbasiertes Sampling an, ohne Informationen über die Thread-Verwendung oder Thread-bezogene Informationen. Die Menge an Informationen, die ich erhielt, war wirklich mittelmäßig. Zusätzlich verursachte es Abstürze in der QT-Integration von Visual Studio. Ich war nicht zufrieden :(
Smerlin

7

Haben Sie eine MFC OnIdle-Funktion? In der Vergangenheit hatte ich eine Echtzeit-App, die ich reparieren musste und die serielle Pakete verwarf, wenn sie auf eine Geschwindigkeit von 19,2 K eingestellt war, mit der ein PentiumD hätte Schritt halten können. Die OnIdle-Funktion war das, was Dinge tötete. Ich bin mir nicht sicher, ob QT dieses Konzept hat, aber ich würde es auch überprüfen.


2
Wir haben tatsächlich ein OnIdle, und dank unserer QTMFC-Integration fließt es durch die QT-Ereignisschleife. Oh G'd.
Jake Kurzer

Es stellt sich heraus, dass dies direkt zu unserer Lösung führt. Obwohl dies keine perfekte Antwort auf die Frage ist, halte ich die Frage für unbeantwortbar.
Jake Kurzer

4

Zum VS Profiler - Wenn er so große Dateien generiert, ist Ihr Abtastintervall möglicherweise zu häufig? Versuchen Sie es zu senken, da Sie wahrscheinlich sowieso genug Proben haben.

Und im Idealfall stellen Sie sicher, dass Sie keine Proben sammeln, bis Sie den Problembereich tatsächlich trainieren. Beginnen Sie also mit einer angehaltenen Sammlung, lassen Sie Ihr Programm seine "langsame Aktivität" ausführen und starten Sie dann die Sammlung. Sie benötigen höchstens 20 Sekunden Abholung. Stoppen Sie danach die Sammlung.

Dies sollte dazu beitragen, die Größe Ihrer Beispieldateien zu reduzieren und nur das zu erfassen, was für Ihre Analyse erforderlich ist.


Ich werde es morgen versuchen.
Jake Kurzer

4

Ich habe PurifyPlus für Windows erfolgreich verwendet . Obwohl es nicht billig ist, bietet IBM eine Testversion an, die leicht verkrüppelt ist. Alles, was Sie für die Profilerstellung mit quantify benötigen, sind PDF-Dateien und die Verknüpfung mit / FIXED: NO. Einziger Nachteil: Keine Unterstützung für Win7 / 64.


Leider ist unser Hauptziel Win7. Ich werde diese Informationen zum Hauptbeitrag hinzufügen.
Jake Kurzer

1
Die aktuelle Version von PurifyPlus unterstützt Win7 / 64.
Hmuelner

3

Easyprofiler - Ich habe es hier noch nicht erwähnt gesehen, bin mir also nicht sicher, ob du es dir schon angesehen hast. Bei der Erfassung von Metrikdaten wird ein etwas anderer Ansatz gewählt. Ein Nachteil bei der Verwendung des Profils zur Kompilierungszeit besteht darin, dass Sie Änderungen an der Codebasis vornehmen müssen. Daher müssen Sie eine Vorstellung davon haben, wo die Verlangsamung sein könnte, und dort Profilcode einfügen.

Obwohl durch Ihre neuesten Kommentare gehen, es klingt wie Sie zumindest zu machen sind einige Fortschritte. Möglicherweise bietet dieses Tool einige nützliche Metriken für Sie. Wenn nichts anderes, hat es einige wirklich reine Diagramme und Bilder: P.


3

Zwei weitere Werkzeugvorschläge.

Luke Stackwalker hat einen niedlichen Namen (auch wenn er für meinen Geschmack etwas anstrengend ist), er kostet Sie nichts und Sie erhalten den Quellcode. Es wird behauptet, auch Multithread-Programme zu unterstützen. Es ist also sicher eine Spritztour wert.

http://lukestackwalker.sourceforge.net/

Auch Glowcode, auf den ich mich als wertvoll erwiesen habe:

http://www.glowcode.com/

Leider habe ich eine Weile keine PC-Arbeit mehr gemacht, also habe ich beides nicht ausprobiert. Ich hoffe die Vorschläge helfen trotzdem weiter.


3

Kasse XPerf

Dies ist ein kostenloser, nicht invasiver und erweiterbarer Profiler, der von MS angeboten wird. Es wurde von Microsoft entwickelt, um Windows zu profilieren.


3

Wenn Sie der Ereignisschleife misstrauisch gegenüberstehen, können Sie dann QCoreApplication :: notify () und die manuelle Profilerstellung für Dosome (eine oder zwei Zuordnungen von Absendern / Ereignissen zu Anzahl / Zeit) überschreiben ?

Ich denke, dass Sie zuerst die Häufigkeit von Ereignistypen protokollieren und dann diese Ereignisse genauer untersuchen (welches Objekt sendet es, was enthält es usw.). Signale über Threads hinweg werden implizit in die Warteschlange gestellt, sodass sie in der Ereignisschleife enden (natürlich auch explizite Verbindungen in der Warteschlange).

Wir haben es getan, um Ausnahmen in unseren Ereignishandlern abzufangen und zu melden, sodass wirklich jedes Ereignis dort durchlaufen wird.

Nur eine Idee.


Das ist eine schöne Idee! Ich bin nicht an eine QT-Umgebung gewöhnt, da ich den größten Teil meiner Arbeit mit pyGTK hier erledigt habe. Danke dir!
Jake Kurzer

Haben Sie eine empfohlene Methode zur Beschaffung und Auflösung der Art bestimmter Signale?
Jake Kurzer

Ich habe es nur für Signale mit QStateMachine :: SignalEvent gemacht, was nicht dasselbe zu sein scheint. Die Quelle sollte weiterhin der QObject* objectParameter sein. Vielleicht ist MetaCall der Typ für alle Signale (scheint wahrscheinlich), aber ich bin mir nicht sicher. Dies geht ein bisschen über meine Erfahrung hinaus, aber ein Blick in die Qt-Quelle könnte etwas Wahres herausfinden. (Oder stellen Sie eine genauere Frage zu Signalaufrufen in der Warteschlange hier auf SO .. :)
Macke

2

Bearbeiten: Ich sehe jetzt, dass Sie dies in Ihrem ersten Beitrag erwähnt haben. Verdammt, ich hätte nie gedacht, dass ich dieser Typ sein würde.

Mit Pin können Sie Ihren Code feiner granulieren. Ich denke, mit Pin können Sie ein Tool erstellen, mit dem Sie zählen können, wie oft Sie eine Funktion eingeben oder wie viele Clockticks Sie dort ausgeben, und so etwas wie VTune oder CodeAnalyst grob emulieren. Dann können Sie festlegen, welche Funktionen instrumentiert werden, bis Ihre Timing-Probleme behoben sind.


Eigentlich war PIN das, wonach ich zuerst griff. Es gibt tatsächlich etwas namens PIN Play, das perfekt wäre, aber es ist nicht für die Veröffentlichung außerhalb von Intel vorgesehen. Ich bin mir nicht sicher, ob ich mich genug an die Verwendung der PIN erinnere, um etwas wirklich Gutes zusammenzubringen, aber ...
Jake Kurzer

2

Ich kann dir sagen, was ich jeden Tag benutze.

a) AMD Code Analyst

  • Es ist einfach und gibt Ihnen einen schnellen Überblick über das Geschehen. Es wird für die meiste Zeit in Ordnung sein.
  • Bei AMD-CPUs werden Informationen zur CPU-Pipeline angezeigt, die Sie jedoch nur benötigen, wenn Sie über starke Schleifen verfügen, z. B. in Grafik-Engines, Video-Codecs usw.

b) VTune.

  • Es ist sehr gut in vs2008 integriert

  • Nachdem Sie die Hotspots kennen, müssen Sie nicht nur die Zeit abtasten, sondern auch andere Dinge wie Cache-Fehler und Speichernutzung. Das ist sehr wichtig . Richten Sie eine Stichprobensitzung ein und bearbeiten Sie die Eigenschaften. Ich probiere immer nach Zeit, Lese- / Schreib- und Cache-Fehlern im Speicher (drei verschiedene Läufe).

Aber mehr als das Tool müssen Sie Erfahrung mit der Profilerstellung sammeln. Und das bedeutet zu verstehen, wie die CPU / Speicher / PCI funktioniert ... also ist dies meine dritte Option

c) Unit-Test

Dies ist sehr wichtig, wenn Sie eine große Anwendung entwickeln, die eine enorme Leistung benötigt. Wenn Sie die App nicht in einige Teile aufteilen können, ist es schwierig, die CPU-Auslastung zu verfolgen. Ich teste nicht alle Fälle und Klassen, aber ich habe hartcodierte Ausführungen und Eingabedateien mit wichtigen Funktionen.

Mein Rat ist, in mehreren kleinen Tests Zufallsstichproben zu verwenden und zu versuchen, eine Profilstrategie zu standardisieren.


AMD Code Analyst ist in meiner Entwicklungsumgebung instabil und wird von VTune ausdrücklich nicht unterstützt. : S
Jake Kurzer

2

Ich verwende xperf / ETW für alle meine Profilierungsanforderungen. Es hat eine steile Lernkurve, ist aber unglaublich leistungsfähig. Wenn Sie unter Windows ein Profil erstellen, müssen Sie xperf kennen. Ich verwende diesen Profiler häufig, um Leistungsprobleme in meinem Code und im Code anderer Personen zu finden.

In der Konfiguration, die ich benutze:

  • xperf holt CPU-Samples von jedem Kern, der alle ms Code ausführt. Die Abtastrate kann auf 8 kHz erhöht werden und die Abtastwerte enthalten Benutzermodus und Kernelcode. Auf diese Weise können Sie herausfinden, was ein Thread tut, während er ausgeführt wird
  • xperf zeichnet jeden Kontextwechsel auf (ermöglicht eine perfekte Rekonstruktion der Zeit, die jeder Thread benötigt) sowie Aufrufstapel für das Einschalten von Threads sowie Aufrufstapel für den Thread, der einen anderen Thread vorbereitet hat, wodurch Warteketten verfolgt und herausgefunden werden können, warum ein Thread Läuft nicht
  • xperf zeichnet alle Datei-E / A aller Prozesse auf
  • xperf zeichnet alle Festplatten-E / A aller Prozesse auf
  • xperf zeichnet auf, welches Fenster aktiv ist, die CPU-Frequenz, den CPU-Energiezustand, Verzögerungen der Benutzeroberfläche usw.
  • xperf kann auch alle Heap-Zuordnungen von einem Prozess, alle virtuellen Zuordnungen von allen Prozessen und vieles mehr aufzeichnen.

Das sind viele Daten auf einer Zeitachse für alle Prozesse. Kein anderer Profiler unter Windows kann das.

Ich habe ausführlich über die Verwendung von xperf / ETW gebloggt. Diese Blog-Beiträge und einige professionelle Trainingsvideos finden Sie hier: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

Wenn Sie herausfinden möchten, was passieren kann, wenn Sie xperf nicht verwenden, lesen Sie diese Blog-Beiträge: http://randomascii.wordpress.com/category/investigative-reporting/ Dies sind Geschichten über Leistungsprobleme, die ich im Code anderer Leute gefunden habe , das sollte von den Entwicklern gefunden worden sein. Dazu gehören das Laden von mshtml.dll in den VC ++ - Compiler, ein Denial-of-Service in den Find-in-Dateien von VC ++, die thermische Drosselung auf einer überraschenden Anzahl von Kundencomputern, langsame Einzelschritte in Visual Studio und eine Zuweisung von 4 GB in einem Hard- Festplattentreiber, ein Powerpoint-Leistungsfehler und mehr.


1

Ich habe gerade die erste verwendbare Version von CxxProf fertiggestellt , einer tragbaren manuell instrumentierten Profilierungsbibliothek für C ++.

Es erfüllt folgende Ziele:

  • Einfache Integration
  • Entfernen Sie die Bibliothek einfach während der Kompilierungszeit
  • Entfernen Sie die Bibliothek einfach zur Laufzeit
  • Unterstützung für Multithread-Anwendungen
  • Unterstützung für verteilte Systeme
  • Halten Sie die Auswirkungen auf ein Minimum

Diese Punkte wurden aus dem Projekt-Wiki herausgerissen. Weitere Details finden Sie dort.

Haftungsausschluss: Ich bin der Hauptentwickler von CxxProf


1

Nur um es wegzuwerfen, auch wenn es sich nicht um einen vollständigen Profiler handelt: Wenn Sie nur nach Ereignisschleifen hängen, deren Verarbeitung eines Ereignisses lange dauert, ein Ad-hoc-Tool in Qt eine einfache Sache. Dieser Ansatz könnte leicht erweitert werden, um zu verfolgen, wie lange die Verarbeitung jedes Ereignisses gedauert hat und wie diese Ereignisse waren und so weiter. Es ist kein universeller Profiler, sondern ein ereignisschleifenzentrierter.

In Qt werden alle Thread-übergreifenden Signalschlitzaufrufe über die Ereignisschleife geliefert, ebenso wie Timer, Netzwerk- und serielle Port-Benachrichtigungen und alle Benutzerinteraktionen. Das Beobachten der Ereignisschleifen ist daher ein großer Schritt, um zu verstehen, wo die Anwendung ihre Zeit verbringt.


0

DevPartner, ursprünglich von NuMega entwickelt und jetzt von MicroFocus vertrieben, war einst die Lösung der Wahl für die Profilerstellung und Code-Analyse (z. B. Speicher- und Ressourcenlecks). Ich habe es in letzter Zeit nicht ausprobiert, daher kann ich Ihnen nicht versichern, dass es Ihnen helfen wird. Aber ich hatte einmal hervorragende Ergebnisse damit, so dass dies eine Alternative ist, die ich in Betracht ziehe, um sie in unserem Codequalitätsprozess neu zu installieren (sie bieten eine 14-tägige Testversion).


0

Obwohl Ihr Betriebssystem Win7 ist, kann das Programm nicht unter XP ausgeführt werden? Wie wäre es mit einem Profil unter XP und das Ergebnis sollte ein Hinweis für win7 sein.


Sicher könnte es sein, aber das würde den Kauf einer Lizenz für ein Produkt erfordern, das Ihre gewünschte Entwicklungsumgebung möglicherweise nie gut unterstützt oder Jahre dauern kann. 1,5k ist eine Menge Geld zu wetten, zuzüglich der Kosten für das Imaging und die Bereitstellung einer XP-Box.
Jake Kurzer

0

Hier sind viele Profiler aufgelistet, und ich habe einige davon selbst ausprobiert. Am Ende habe ich jedoch meine eigenen geschrieben:

http://code.google.com/p/high-performance-cplusplus-profiler/

Es erfordert natürlich, dass Sie die Codebasis ändern, aber es ist perfekt, um Engpässe einzugrenzen, sollte auf allen x86s funktionieren (könnte ein Problem bei Multi-Core-Boxen sein, dh es wird jedoch rdtsc verwendet - dies dient ohnehin nur dem indikativen Timing - also finde ich es reicht für meine Bedürfnisse ..)



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.