Ich neige dazu, ziemlich große C ++ - Bibliotheken nur mit Headern zu schreiben, und meine Benutzer beschweren sich häufig über Kompilierungszeiten. Nachdem ich über die Sache nachgedacht hatte, kam mir der Gedanke , dass ich keine Ahnung habe, wohin die Zeit geht . Gibt es eine einfache Möglichkeit, den C ++ - Kompilierungsprozess mit gängigen Compilern wie g ++, icc und xlC zu profilieren? Ist es beispielsweise möglich, eine Vorstellung davon zu bekommen, wie viel Zeit in jeder der Phasen der C ++ - Kompilierung verbracht wird ?
c++
compilation
profiling
Jack Poulson
quelle
quelle
Antworten:
Für GCC gibt es Debugging-Optionen zu finden
how much time is spent within each of the phases of C++ compilation?
Passes werden in GCCINT 9: Passes und Dateien des Compilers beschrieben .
Sie können die Ausgabe der g ++ - Kompilierung einer einzelnen Quelldatei
-v -ftime-report
hier veröffentlichen, um dies zu diskutieren . Es könnte Hilfe auf der GCC- Mailingliste geben .Für andere Compiler als GCC (oder GCC älter als 3.3.6 ) siehe die anderen Optionen in diesem Thread.
quelle
-Q
Ausgabe kann von einem awk- oder perl-Skript erfasst, analysiert und analysiert werden. oder Sie können einfach beim Drucken von Funktionsnamen auf der Konsole zusehen, welche nach langer Pause gedruckt wurde, war schwer zu kompilieren.gcc/toplev.c
(announce_function
- "Wenn der Start einer Funktionsdefinition analysiert wird, druckt diese Funktion auf stderr den Namen der Funktion"). Diesannounce_function
kann der Punkt sein, an dem der Zeitstempel (gettimeofday) gedruckt oder die Ausgabe ungepuffert neu geschrieben werden soll. Oder die andere Möglichkeit besteht darin, Debug-Dumps (-fdump-rtl-all-all
-fdump-tree-all-all
-fdump-ipa-all-all
) zu aktivieren, die jedoch 1 Datei pro Durchgang ausgeben. Sie müssen sie konvertieren, um 1 Datei pro Durchgang und pro Funktion auszugeben (viele Dateien mit Erstellungszeit erhalten).Es gibt ein Tool aus dem Boost-Projekt, das für so ziemlich jeden Compiler und jedes Build-System nützlich sein kann.
Das Tool erfordert eine Quellcode-Instrumentierung mit
TEMPLATE_PROFILE_ENTER()
undTEMPLATE_PROFILE_EXIT()
Makroaufrufen. Diese Makros generieren dann zur Kompilierungszeit spezifische Diagnosen (Warnungen), die zeitgesteuert und zusammen mit Instanziierungs-Callstacks (die folglich das Erstellen und Visualisieren von Callgraphs ermöglichen) durch ein Skript erfasst werden. Nicht schlecht, IMO.Ich habe es aber noch nicht benutzt.
quelle
Clang 9 (und neuer) verfügt über ein
-ftime-trace
Flag, mit dem ein Profilbericht als JSON (zusätzlich zu einer Objektdatei) ausgegeben wird.Sie können diese Datei in einen mit Chrome (
chrome://tracing
) gelieferten Profiler importieren , um eine schöne Visualisierung zu erhalten:Die Balken entsprechen Headern, die analysiert werden mussten, und für jeden Header bestimmten Klassen (und wahrscheinlich anderen Konstrukten), die analysiert werden mussten. Außerdem wird die Zeit angegeben, die für die Instanziierung bestimmter Vorlagen aufgewendet wurde.
quelle
Ich habe es noch nicht ausprobiert, aber Templight sieht SEHR vielversprechend aus: https://github.com/mikael-s-persson/templight
quelle
Sie können sie bis zu einem gewissen Grad trennen (ich nehme an
make
)-E
Schalters), und ein.PHONY
Ziel, das von den Präprozessor-Ausgabedateien abhängt, hängt genau wie das normale binäre Ziel von.o
Dateien ab. Messen Sie, wie lange es dauert, dieses Ziel zu erstellen'PHONY
Ziel hinzu, das von allen.o
Dateien abhängt , diese jedoch nicht verknüpft. Messen Sie, wie lange es dauert, dieses Ziel zu erstellen (von sauber)Jetzt haben Sie eine Vorstellung davon, wie lange das Vorverarbeiten, Kompilieren und Verknüpfen dauert. Sie können auch optimierte und nicht optimierte (
-O0
) Versionen des zweiten und dritten Ziels vergleichen, um festzustellen, wie lange im Optimierer verbracht wird.quelle
Möglicherweise können Sie mit einer bestimmten Variante eine gewisse Traktion erzielen
strace -e trace=process -f -r -ttt -T
, zumindest für Compiler wie g ++, die in viele Prozesse unterteilt sind.quelle
Andere haben bereits das
-ftime-report
Befehlszeilenflag für GCC vorgeschlagen, wodurch der Compiler einige Statistiken über die von jeder Kompilierungsphase benötigte Zeit druckt. Der Nachteil ist, dass nur eine Zusammenfassung für eine Einheit angezeigt wird.Ich habe ein Python- Skript geschrieben , mit dem die Gesamtzusammenfassung für jede Einheit in jeder Kompilierungsphase unter Berücksichtigung der Projekterstellungsprotokolldatei gedruckt werden kann. Es ermöglicht auch das Sortieren nach verschiedenen Phasen. Außerdem können zwei Protokolldateien verglichen werden (z. B. wenn Sie versuchen, die Auswirkungen Ihrer Änderungen zu verstehen).
quelle