Profilierung von C++-Code: Engpässe in der Praxis finden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Profilierung kein Luxus, sondern eine Notwendigkeit ist

\n

Jeder C++-Entwickler kennt die Situation, in der ein Programm zwar läuft, aber langsam ist. Intuitive Vermutungen darüber, welcher Codeabschnitt „bremst“, erweisen sich oft als falsch. Ohne genaue Daten riskieren Sie, das zu optimieren, was ohnehin schnell läuft, und übersehen dabei die wahren „Flaschenhälse“. Profilierung ist die einzige wissenschaftliche Methode, um die Leistung zu messen und Engpässe zu finden.

\n

In diesem Artikel behandeln wir drei leistungsstarke Werkzeuge zur Profilierung von C++-Code: gprof (statistisch), Perf (hardwarebasiert) und Valgrind/Callgrind (Simulation). Sie erfahren, wie Sie diese in der Praxis anwenden, Ergebnisse interpretieren und problematische Stellen schnell finden.

\n\n

1. Statistische Profilierung mit gprof: Schnellstart

\n

gprof ist der klassische GNU-Profiler, der auf statistischer Stichprobenerhebung basiert. Er erfordert keine speziellen Rechte und eignet sich ideal für eine erste Analyse.

\n\n

So bereiten Sie den Code vor

\n

Für die Arbeit mit gprof muss das Programm mit den Flags -pg und -g kompiliert werden:

\n
g++ -pg -g main.cpp -o my_program\n./my_program
\n

Nach der Ausführung des Programms erscheint im aktuellen Ordner eine Datei namens gmon.out. Um einen lesbaren Bericht zu erhalten, führen Sie Folgendes aus:

\n
gprof my_program gmon.out > report.txt
\n\n

Beispiel: Einen langsamen Algorithmus finden

\n

Betrachten wir ein einfaches Programm, das ein Array auf zwei Arten sortiert:

\n
#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <chrono>\n\nvoid bubble_sort(std::vector<int>& arr) {\n    for (size_t i = 0; i < arr.size(); ++i)\n        for (size_t j = 0; j < arr.size() - i - 1; ++j)\n            if (arr[j] > arr[j+1])\n                std::swap(arr[j], arr[j+1]);\n}\n\nvoid quick_sort_wrapper(std::vector<int>& arr) {\n    std::sort(arr.begin(), arr.end());\n}\n\nint main() {\n    std::vector<int> data(50000);\n    std::generate(data.begin(), data.end(), std::rand);\n    \n    auto copy1 = data;\n    auto copy2 = data;\n    \n    bubble_sort(copy1);\n    quick_sort_wrapper(copy2);\n    \n    return 0;\n}
\n

Starten Sie die Profilierung. Im gprof-Bericht sehen Sie eine Aufruftabelle. bubble_sort wird 95-99% der Zeit beanspruchen. Dies ist ein offensichtlicher Engpass – das Ersetzen der Blasensortierung durch std::sort bringt sofortige Leistungssteigerung.

\n\n

Interpretation der Ergebnisse

\n

Suchen Sie im Bericht nach der Spalte % time – sie zeigt den Zeitanteil, der in der Funktion verbracht wurde. Funktionen mit einem hohen Prozentsatz sind Ihre Kandidaten für die Optimierung.

\n\n

2. Hardware-Profilierung mit Perf: Präzision bis zum Takt

\n

Perf ist ein modernes Tool für Linux, das Hardware-Zähler der CPU nutzt. Es verursacht nur minimale Zusatzkosten und ermöglicht die Messung nicht nur der Zeit, sondern auch von Cache-Fehlern, Branch-Misses und anderen Metriken.

\n\n

Installation und grundlegende Verwendung

\n
sudo apt install linux-tools-common linux-tools-generic  # Ubuntu/Debian\nperf stat ./my_program   # Gesamtstatistik\nperf record ./my_program # Profil aufzeichnen\nperf report              # Bericht anzeigen
\n\n

Beispiel: Cache-Fehler finden

\n

Angenommen, wir haben eine Funktion, die eine Matrix zeilenweise verarbeitet:

\n
const int N = 4096;\nint matrix[N][N];\n\nvoid process_rows() {\n    for (int i = 0; i < N; ++i)\n        for (int j = 0; j < N; ++j)\n            matrix[i][j] *= 2;\n}\n\nvoid process_cols() {\n    for (int j = 0; j < N; ++j)\n        for (int i = 0; i < N; ++i)\n            matrix[i][j] *= 2;\n}
\n

Führen Sie perf stat für jede Funktion aus. Sie werden sehen, dass process_cols eine Größenordnung mehr cache-misses aufweist. Der Grund

Blogs

Buchempfehlungen