Was ist Ihr Lieblings-Profiling-Tool (für C ++)? [Geschlossen]

81

Bisher habe ich nur Rational Quantify verwendet. Ich habe großartige Dinge über Intels VTune gehört, es aber noch nie ausprobiert!

Bearbeiten: Ich suche hauptsächlich nach Software, die den Code instrumentiert, da ich denke, dass dies der einzige Weg ist, um sehr gute Ergebnisse zu erzielen.


Siehe auch:

Was sind einige gute Profiler für natives C ++ unter Windows?

OysterD
quelle
Möchten Sie 1) messen oder 2) Beschleunigungen finden? Wenn Sie 2 wollen und Sie denken, dass dies 1 erfordert, ist das nicht so. Um Beschleunigungen zu finden, benötigen Sie keine "sehr guten Ergebnisse". Wenn das Programm verbringt 90% seiner Zeit etwas zu tun , könnte man sehr gut entfernen , wenn Sie weiß , was es war, Stapel Proben zeigen es Ihnen in 9 von 10. Wenn Sie bei 10 Proben suchen, sind Sie vorsichtig sein, wenn Sie sehen , es 10 mal, 9 mal oder 8 mal? In jedem Fall wissen Sie , was es ist . Der gemessene Prozentsatz spielt keine Rolle.
Mike Dunlavey

Antworten:

35

Für die Linux-Entwicklung (obwohl einige dieser Tools möglicherweise auf anderen Plattformen funktionieren). Dies sind die beiden großen Namen, die ich kenne. Es gibt viele andere kleinere Namen, die seit einiger Zeit keine aktive Entwicklung mehr gesehen haben.

Al.
quelle
27

Für Linux: Google Perftools

  • Schneller als Valgrind (noch nicht so feinkörnig)
  • Benötigt keine Code-Instrumentierung
  • Schöne grafische Ausgabe (-> kcachegrind)
  • Führt Speicherprofile, CPU-Profile und Leckprüfungen durch
Weidenrinde
quelle
9

IMHO ist das Sampling mit einem Debugger die beste Methode. Sie benötigen lediglich eine IDE oder einen Debugger, mit dem Sie das Programm anhalten können. Es nagelt Ihre Leistungsprobleme, bevor Sie den Profiler überhaupt installieren.

Mike Dunlavey
quelle
3
Ja! Das funktioniert gut für mich. Es braucht keine Instrumentierung. Es muss kein Profiler usw. installiert sein. Unter Linux können Sie gdb verwenden. Das Programm läuft mit voller Geschwindigkeit. Drücken Sie Strg-C, um anzuhalten. Geben Sie 'bt' ein, um die Stapelverfolgung anzuzeigen. Dann 'c' um fortzufahren, dann wieder Strg-C. Funktioniert super! Ich habe gerade meine Ausführungszeit in einem komplexen Programm mit dieser Technik um 20% reduziert. Genial!
Hugh Perkins
@ HughPerkins: Danke für deine Bearbeitung und ich bin froh, dass du Erfolg hast. (Ich wette, Sie können besser als 20% machen :)
Mike Dunlavey
1
Ja, ich habe die Iterationszeit von 1200 ms auf 200 ms in wenigen Stunden verkürzt, wobei ich nur gdb + ctrl-c verwendet habe, um die Hotspots zu lokalisieren :-)
Hugh Perkins
@ HughPerkins: Wenn ich an meinem eigenen Code arbeite, ist es für mich schwierig zu wissen, wann ich aufhören soll, es zu versuchen - es scheint, als könnte ich ihn immer noch mehr drücken. Wenn ich an einem anderen Code arbeite, kann ein Problem auftreten. Ich kann den "Besitzer" des Codes nicht immer davon überzeugen, das Problem zu beheben, daher kommt der Prozess zum Stillstand. Es ist ein interessantes Rätsel.
Mike Dunlavey
Wenn Sie dies nur ohne Instrumentierung erreichen möchten, benötigen Sie unter Linux nicht einmal einen Debugger oder eine IDE. Führen Sie einfach "pstack <pid>" aus, um den laufenden Trace-Befehl zu stapeln. Es ist viel einfacher, als einen Debugger zu starten, dann manuell zu brechen und dann nach Stacktrace zu suchen.
Manish Sogi
7

Meine einzige Erfahrung mit der Profilerstellung von C ++ - Code habe ich mit AQTime von AutomatedQA (jetzt SmartBear Software). Es sind verschiedene Arten von Profilern integriert (Leistung, Speicher, Windows-Handles, Ausnahmeverfolgung, statische Analyse usw.) und der Code wird instrumentiert, um die Ergebnisse zu erhalten.

Ich habe es genossen - es hat immer Spaß gemacht, die Stellen zu finden, an denen eine kleine Änderung des Codes die Leistung dramatisch verbessern kann.

Matt Dillard
quelle
Das funktioniert leider nur unter Windows.
Bram
6

Ich habe noch nie ein Profiling durchgeführt. Gestern habe ich eine ProfilingTimer-Klasse mit einem statischen Zeitplan (eine Map <std :: string, long long>) für die Zeitspeicherung programmiert.

Der Konstruktor speichert das Start-Tick, und der Destruktor berechnet die verstrichene Zeit und fügt sie der Karte hinzu:

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

In jeder Funktion (oder {Block}), die ich profilieren möchte, muss ich Folgendes hinzufügen:

ProfilingTimer _ProfilingTimer("identifier");

Das Hinzufügen dieser Zeile in allen Funktionen, die ich profilieren möchte, ist etwas umständlich, da ich raten muss, welche Funktionen viel Zeit in Anspruch nehmen. Aber es funktioniert gut und die Druckfunktion zeigt den Zeitaufwand in% an.

(Arbeitet noch jemand mit einem ähnlichen "hausgemachten Profiling"? Oder ist es einfach nur dumm? Aber es macht Spaß! Hat jemand Verbesserungsvorschläge?

Gibt es eine Art automatisches Hinzufügen einer Zeile zu allen Funktionen?)

Moberg
quelle
5

Ich habe Glowcode in der Vergangenheit ausgiebig verwendet und nur positive Erfahrungen damit gemacht. Die Visual Studio-Integration ist wirklich gut und der effizienteste / intuitivste Profiler, den ich je verwendet habe (sogar im Vergleich zu Profilern für verwalteten Code).

Das ist natürlich nutzlos, wenn Sie nicht unter Windows laufen, aber die Frage lässt mir unklar, was genau Ihre Anforderungen sind.

jsight
quelle
5

ohne Zweifel oprofile; Es ist einfach, zuverlässig, erledigt die Aufgabe und kann alle möglichen netten Aufschlüsselungen von Daten liefern.

Dunkler Shikari
quelle
5

Der Profiler in Visual Studio 2008 ist sehr gut: schnell, benutzerfreundlich, klar und gut in die IDE integriert.

Dimitri C.
quelle
2
Ist der Profiler nicht nur in der Team-Version?
Dwj
@dwj: Ich bin nicht sicher. Ich verwende Visual Studio Team System 2008 Development Edition.
Dimitri C.
Sieht so aus, als ob es nur in der Team Edition ( stackoverflow.com/questions/61669/… ) für Versionen vor 2010 ist.
dwj
4

Schauen Sie sich unter Windows Xperf an . Es verwendet ein abgetastetes Profil, verfügt über eine nützliche Benutzeroberfläche und erfordert keine Instrumentierung. Sehr nützlich, um Leistungsprobleme aufzuspüren. Sie können Fragen beantworten wie:

  • Wer nutzt die meiste CPU? Drilldown zum Funktionsnamen mithilfe von Call-Stacks.
  • Wer reserviert am meisten Speicher?
  • Wer führt die meisten Registrierungsabfragen durch?
  • Festplatten schreibt? etc.

Sie werden ziemlich überrascht sein, wenn Sie die Engpässe finden, da sie wahrscheinlich nicht dort sind, wo Sie es erwartet haben!

user15071
quelle
3

Für die Profilerstellung gelten unterschiedliche Anforderungen. Ist instrumentierter Code in Ordnung oder müssen Sie optimierten Code (oder sogar bereits kompilierten Code) profilieren? Benötigen Sie zeilenweise Profilinformationen? Welches Betriebssystem verwenden Sie? Müssen Sie auch gemeinsam genutzte Bibliotheken profilieren? Was ist mit der Rückverfolgung von Systemaufrufen?

Persönlich verwende ich oprofile für alles, was ich tue, aber das ist möglicherweise nicht in jedem Fall die beste Wahl. Vtune und Shark sind beide ausgezeichnet.

Louis Brandy
quelle
3

Da Sie die Plattform, an der Sie arbeiten, nicht erwähnen, sage ich Cachegrind unter Linux. Bestimmt. Es ist Teil des Valgrind-Toolset.

http://valgrind.org/info/tools.html

Ich habe noch nie sein Untermerkmal Callgrind verwendet, da die meisten meiner Code - Optimierung für ist innerhalb Funktionen.

Beachten Sie, dass ein Frontend-KCachegrind verfügbar ist.

rlerallut
quelle
3

Für die Windows-Entwicklung habe ich den Performance Validator von Software Verification verwendet - er ist schnell, ziemlich genau und preiswert. Das Beste ist jedoch, dass es einen laufenden Prozess instrumentieren kann und Sie die Datenerfassung zur Laufzeit sowohl manuell als auch basierend auf dem Callstack ein- und ausschalten können - ideal für die Profilerstellung eines kleinen Abschnitts eines größeren Programms.

Shog9
quelle
3

Für Windows habe ich AMD Codeanalyst, Intel VTune und den Profiler in Visual Studio Team Edition ausprobiert.

Codeanalyst ist fehlerhaft (stürzt häufig ab) und in meinem Code sind die Ergebnisse oft ungenau. Die Benutzeroberfläche ist nicht intuitiv. Um beispielsweise die Anzeige des Aufrufstapels in den Profilergebnissen zu erreichen, müssen Sie auf die Registerkarte "Prozesse" klicken, dann auf den EXE-Dateinamen Ihres Programms klicken und dann auf eine Symbolleistenschaltfläche mit den kleinen Buchstaben "CSS" klicken. Da es sich jedoch um Freeware handelt, können Sie es auch ausprobieren und es funktioniert (mit weniger Funktionen) ohne AMD-Prozessor.

VTune (700 US-Dollar) hat eine schreckliche Benutzeroberfläche IMO; In einem großen Programm ist es schwierig, den gewünschten Aufrufbaum zu finden, und Sie können jeweils nur einen "Knoten" in einem Programm anzeigen (eine Funktion mit ihren unmittelbaren Aufrufern und Anrufern) - Sie können keinen vollständigen anzeigen Baum anrufen. Es gibt eine Aufrufdiagrammansicht, aber ich konnte keine Möglichkeit finden, die relativen Ausführungszeiten im Diagramm anzuzeigen. Mit anderen Worten, die Funktionen in der Grafik sehen unabhängig davon, wie viel Zeit in ihnen verbracht wurde, gleich aus - es ist, als hätten sie den Punkt der Profilerstellung völlig verfehlt.

Der Profiler von Visual Studio verfügt über die beste der drei GUI, kann jedoch aus irgendeinem Grund keine Beispiele aus dem größten Teil meines Codes erfassen (Beispiele werden nur für einige Funktionen in meinem gesamten C ++ - Programm erfasst). Außerdem konnte ich keinen Preis oder eine Möglichkeit finden, es direkt zu kaufen. Aber es kommt mit dem MSDN-Abonnement meines Unternehmens. Visual Studio unterstützt verwalteten, nativen und gemischten Code. Bei den beiden anderen Profilern bin ich mir diesbezüglich nicht sicher.

Zusammenfassend kenne ich noch keinen guten Profiler! Ich werde sicher die anderen Vorschläge hier überprüfen.

Qwertie
quelle
3

Ich benutze devpartner für die PC-Plattform.

EvilTeach
quelle
Es instrumentiert den Code. Es hat Code-Abdeckung und Boundschecking (instrumentiert und uninstrumentiert)
EvilTeach
2

Ich habe versucht, eine AQTime zu quantifizieren, und Quantify hat aufgrund seiner unschätzbaren Funktionen "Fokus auf Unterbaum" und "Unterbaum löschen" gewonnen.

eli
quelle
Volle Bestätigung. Ich musste nur ein Profil für eine C ++ - Anwendung erstellen, und genau diese Funktionen haben meinen Tag wirklich geprägt.
Enno
2

Die einzige sensible Antwort ist die PTU von Intel. Natürlich ist es am besten, es auf einem Intel-Prozessor zu verwenden und zumindest auf einem C2D-Computer noch wertvollere Ergebnisse zu erzielen, da die Architektur selbst einfacher ist, aussagekräftige Profile zurückzugeben.

Fabien Hure
quelle
2

Ich habe VTune unter Windows und Linux viele Jahre lang mit sehr guten Ergebnissen verwendet. Spätere Versionen haben sich verschlechtert, als sie dieses Produkt an die Qualität und Leistung ihrer russischen Entwicklungsmannschaft ausgelagert haben (erhöhte VTune-Abstürze, oft mehr als 15 Minuten, um eine Analysedatei zu öffnen).

In Bezug auf die Instrumentierung stellen Sie möglicherweise fest, dass dies weniger nützlich ist als Sie denken. Bei Anwendungen, an denen ich gearbeitet habe, verlangsamt das Hinzufügen von Instrumenten das Produkt häufig so sehr, dass es nicht mehr funktioniert (wahre Geschichte: App starten, nach Hause gehen, am nächsten Tag wiederkommen, App wird noch initialisiert). Mit nicht instrumentierten Profilen können Sie auch auf Live-Probleme reagieren. Mit VTune Remote Date Collector kann ich beispielsweise eine Sampling-Sitzung für einen Live-Server mit Hunderten von gleichzeitigen Verbindungen starten, bei denen Leistungsprobleme auftreten und Probleme in der Produktion auftreten, die ich in einer Testumgebung niemals replizieren könnte.

Don Neufeld
quelle
2

ElectricFence eignet sich gut zum Debuggen von Mallocs

Michael McCarty
quelle
1

Mein Lieblingswerkzeug ist Easy Profiler: http://code.google.com/p/easyprofiler/

Es ist ein Kompilierungszeit-Profiler: Der Quellcode muss manuell mithilfe einer Reihe von Routinen instrumentiert werden, um die Zielregionen zu beschreiben. Sobald die Anwendung ausgeführt und die Maßnahmen automatisch in eine XML-Datei geschrieben wurden, müssen Sie nur noch die Observer-Anwendung öffnen und mit wenigen Klicks auf die Analyse- / Vergleichstools klicken, bevor Sie das Ergebnis in einem qualitativen Diagramm sehen können.

charfeddine.ahmed
quelle
1

Visual Studio 2010 Profiler unter Windows. VTune hatte ein großartiges Anrufdiagramm-Tool, das jedoch ab Windows Vista / 7 defekt war. Ich weiß nicht, ob sie es behoben haben.

Codierer
quelle
0

Lassen Sie mich einen Stecker für EQATEC geben ... genau das, wonach ich gesucht habe ... einfach zu erlernen und zu verwenden und mir die Informationen zu geben, die ich brauche, um die Hotspots schnell zu finden. Ich ziehe es dem in Visual Studio integrierten vor (obwohl ich das VS 2010 noch nicht ausprobiert habe, um fair zu sein).

Die Fähigkeit, Schnappschüsse zu machen, ist RIESIG. Ich lasse oft eine zusätzliche Analyse und Optimierung durchführen, während ich darauf warte, dass die eigentliche Zielanalyse ausgeführt wird ... ich liebe es.

Oh, und seine Basisversion ist kostenlos!
http://www.eqatec.com/Profiler/

Brian Kennedy
quelle