Das ist ganz einfach. Ich muss Linux C++-Programme profilieren:
Mussanforderungen :
gcc
( g++
) kompilierten Programmen arbeitenx86-64
Programmen arbeiten.-O3
). (* siehe Fußnote)Nützliche Funktionen:
hot
Code erkennen)Schöne Features wären:
Zukünftige Anforderungen (ich brauche es jetzt nicht, aber ich werde es in naher Zukunft brauchen):
clang
(wäre schön)Beispielsweise ist der Visual Studio Profiler unter Windows sehr gut.
Ich habe gprof
es unter Linux versucht, konnte es aber nicht mit Optimierungsaktivierung zum Laufen bringen, nicht einmal mit -g -pg
.
(*) Das Vorhandensein von Debug- und Profiling-Informationen kann erforderlich sein (z . B. -p -g -pg
).
Ich profiliere meine Programme mit dem Valgrind - Plugin/Tool callgrind .
Für mich funktioniert dies unter x86_64 mit Optimierungen wie -O3
beim Hinzufügen von Debugging-Symbolen mit -g
. Valgrind ist unter der GPL lizenziert.
Die Ausgabe kann mit kcachegrind oder den Eclipse Linux Tools visualisiert werden
Das Callgrind-Handbuch gibt an, dass es Assembly-Analysen durchführen und mit Gabeln umgehen kann, wenn sie in der Quelle korrekt kommentiert sind.
Es ist einfach zu bedienen:
valgrind --tool=callgrind ./path/to/executable
Es führt das Programm langsamer als normal aus und erstellt eine Datei , callgrind.out.$pid
in $pid
der sich die PID des Aufrufs befindet (es ist die Nummer, die in jeder Zeile der Ausgabe von callgrind angezeigt wird ==$pid==
).
Es kann dann in kcachegrind mit visualisiert werden
kcachegrind callgrind.out.$pid
Sie sollten zumindest über die zufällige Pausentechnik Bescheid wissen . Es erfüllt nicht alle Ihre Anforderungen, aber es ist effektiver als jeder automatisierte Profiler, wenn es darum geht, das zu finden, was Sie "heißen" Code nennen, was ich "Möglichkeiten zur Beschleunigung" nenne.
Der Grund, warum es effektiver ist, ist folgender.
Stellen Sie sich einen idealen Profiler vor. Angenommen, es hat zufällige Stichproben des Programmzustands (einschließlich Stack und Speicher für alle Threads) genommen. Angenommen, es verfügt über künstliche Intelligenz und automatische Programmierfähigkeiten, sodass es sowohl das Programm als auch die Person verstehen kann, die es geschrieben hat. Angenommen, es untersuchte jede Probe und ermittelte den vollständigen Grund für diesen Zeitaufwand und suchte nach einer Möglichkeit, diesen Zeitaufwand zu vermeiden, indem möglicherweise etwas geändert wurde. Wenn es eine solche Gelegenheit zur Beschleunigung sieht und es auf Bruchteil X der Proben sieht, könnte es empfehlen, dass Sie durch diese Änderung bis zu Bruchteil X der Zeit sparen könnten.
Wäre das nicht ein toller Profiler? Es könnte alle möglichen Dinge finden, nicht nur Funktionen, die viel Zeit in Anspruch nehmen, für die Sie nichts tun können.
Es lohnt sich zu fragen - wie viele Proben müsste es nehmen? Die übliche Annahme ist - je mehr desto besser - bessere Präzision. FALSCH! Sie versuchen, das Problem zu finden , nicht es zu messen . Wenn eine Beschleunigungsmöglichkeit den Bruchteil X der Zeit in Anspruch nimmt, wird sie einen Bruchteil X von 10.000 Abtastungen und einen Bruchteil X von 10 Abtastungen (ungefähr) benötigen. Wenn es also groß genug ist, um es zu reparieren, braucht es nicht viele Proben. Tatsächlich muss es ein Problem nur zweimal sehen , um zu wissen, dass es wichtig ist. Im Durchschnitt benötigt es 2/X Samples, wenn also X 0,3 ist, benötigt es 6,67 Samples. (Die statistische Begründung ist hier .)
Nun, wenn es Ihnen nichts ausmacht, Ihren eigenen Kopf zu verwenden und ein paar Proben manuell zu nehmen, wie mit jstack
oder einem Debugger, besitzen Sie bereits diesen idealen Profiler. Viele Programmierer wissen das und nutzen es, um ihren Code blitzschnell zu machen.
Allinea MAP passt zu allem auf Ihrer Liste - es behandelt auch Ihre "zukünftigen Anforderungen" wie es Threads tut. Es gibt nichts Vergleichbares - es hat einen sehr geringen Overhead - normalerweise <5%, während Callgrind weit über 100% liegt.
Es ist kommerziell - aber im Interesse vollständiger Antworten gehört es hierher.
Frank Dernoncourt
Ciro Santilli OurBigBook.com