Ich möchte Zeit (oder Vorkommen) sehr spezifischer Teile in einem C-Code messen (sie können in einigen Funktionen auf einige Anweisungen beschränkt sein). Ein Zweck ist es, lokale Leistungsverbesserungen oder Regressionen über mehrere Code-Revisionen nachzuverfolgen.Instrument C-Code mit Anmerkungen (Pragmas) für die Leistungsverfolgung
Ich weiß, dass ich Makros für diesen Zweck definieren kann. Aber gibt es irgendein Werkzeug, das das schon in einem weniger aufdringlichen Weg tut? Verwendung von Annotationen (#pragma) wäre perfekt:
void func_to_profile()
{
/* Some instructions */
...
#pragma profile foo start
/* A part of the code to track */
...
#pragma profile foo stop
/* More instructions */
...
#pragma profile bar start
/* Another part to measure */
...
#pragma profile bar stop
}
Idealerweise am Ende des Laufes würde das Werkzeug die verstrichene kumulierte mal pro Unterabschnitte anzuzeigen. Zum Beispiel:
-- [foo] cumulated time: 42s
-- [bar] cumulated time: 7s
Gibt es ein vorhandenes Werkzeug, das bereits tut, oder habe ich keine andere Wahl, als meine eigenen GCC-Plugin entwickeln?
Was ist der Unterschied zwischen dem Schreiben von '# Pragma' und dem Verwenden eines Makros? Anders als das Pragma hat keine Chance, tragbar zu sein, während Makros sein können? – Art
Es gibt keine direkte Zuordnung zwischen den Zeilen von C und der optimierten asm-Ausgabe. Wenn der Compiler gezwungen wird, einen bestimmten Teil der Arbeit zwischen zwei Barrieren zu erledigen, könnte dies zu erheblich schlechterem Code führen. Am besten wägen Sie CPU-Leistungsindikatoren (z. B. linux 'perf') ab, um Ausführungs-Hotspots zu finden. Auf x86 ist sogar die leichteste Timing-Instrumentierung (CPUID) ~ 20 Zyklen Overhead, also ist es viel zu schwer, um nur ein paar Befehle zu messen. Verwenden Sie es, um alle Wiederholungen einer Schleife zusammen zu messen, nicht jede einzeln. –
Wenn Sie dies tun, um Beschleunigungen zu finden, müssen Sie ein wenig anders darüber nachdenken. Sie haben sicherlich mehrere Möglichkeiten der Beschleunigung im Code, so dass nur eine von ihnen nicht gut genug ist. Die Chance, dass sie alle Hotspots sind, ist ziemlich klein. Probieren Sie eine [* -Methode aus, vor der sich Beschleuniger nicht verstecken können *] (http://Stackoverflow.com/a/25870103/23771). –