Profilage du code C++ : trouver les goulots d'étranglement pour les débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi est-il important de profiler le code C++ ?

\n

C++ est l'un des langages de programmation les plus rapides, mais même avec lui, on peut écrire du code lent. Souvent, les développeurs passent des heures à optimiser les mauvaises parties du programme, en se fiant à leur intuition. Le profilage est une approche scientifique de l'optimisation : vous mesurez où le programme passe le plus de temps, et vous améliorez ces endroits de manière ciblée.

\n

Pour les programmeurs C++ débutants, le profilage peut sembler complexe, mais en réalité, les outils de base s'apprennent en une soirée. Dans cet article, nous allons examiner trois outils populaires : gprof, perf et Valgrind, et apprendre à interpréter leurs résultats.

\n\n

Qu'est-ce que le profilage et quelles sont les différentes méthodes ?

\n

Le profilage est la collecte de données sur le fonctionnement d'un programme pendant son exécution. Il existe deux approches principales :

\n
    \n
  • Profilage par instrumentation — des "sondes" spéciales sont ajoutées au code du programme (par exemple, gprof). Inconvénient : cela ralentit l'exécution du programme.
  • \n
  • Profilage par échantillonnage — à intervalles réguliers, le profileur "jette un coup d'œil" dans le programme et enregistre quelle fonction est en cours d'exécution (par exemple, perf). Cela ne ralentit quasiment pas le programme.
  • \n
\n

Il existe également des outils pour rechercher les fuites mémoire (Valgrind) et analyser le cache. Pour commencer, il suffit de maîtriser gprof et perf.

\n\n

Outil 1 : gprof — le classique du profilage

\n

gprof est un profileur intégré pour GCC. Il fonctionne en deux étapes : la collecte des données et leur analyse.

\n

Comment utiliser gprof

\n

Compilez d'abord le programme avec l'option -pg :

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

Exécutez le programme :

\n
./my_program
\n

Après l'exécution, un fichier gmon.out apparaît. Lancez maintenant gprof :

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

Ouvrez report.txt et regardez le tableau :

\n
Flat profile:\nEach sample counts as 0.01 seconds.\n  %   cumulative   self              self     total\n time   seconds   seconds    calls  ms/call  ms/call  name\n 60.00      0.06     0.06    10000     0.01     0.01  slow_function\n 30.00      0.09     0.03     5000     0.01     0.02  medium_function\n 10.00      0.10     0.01        1    10.00    10.00  main
\n

Dans la colonne % time, on voit le pourcentage de temps pris par la fonction. Dans notre exemple, slow_function est le principal candidat à l'optimisation.

\n

Conseil : Pour les petits programmes, gprof est parfaitement adapté. Pour les grands projets, il peut donner des données imprécises en raison des optimisations du compilateur.

\n\n

Outil 2 : perf — un puissant échantillonneur pour Linux

\n

perf est un profileur intégré au noyau Linux. Il fonctionne par échantillonnage et ne ralentit quasiment pas le programme. Idéal pour les systèmes de production.

\n

Utilisation de base de perf

\n

Compilez le programme avec les symboles de débogage (option -g) :

\n
g++ -g -o my_program my_program.cpp
\n

Lancez le profilage :

\n
perf record ./my_program
\n

Une fois le programme terminé, consultez le rapport :

\n
perf report
\n

Vous verrez une interface interactive. En cliquant sur une fonction, vous pouvez voir quelles lignes de code ont été exécutées le plus souvent. Exemple de sortie :

\n
Samples: 1K of event 'cycles'\nEvent count (approx.): 250000000\nOverhead  Command      Shared Object     Symbol\n  45.32%  my_program   my_program        [.] slow_function\n  30.15%  my_program   my_program        [.] medium_function\n  12.50%  my_program   libc-2.31.so      [.] malloc\n   8.03%  my_program   my_program        [.] main
\n

Important : perf nécessite les droits root pour collecter des données sur le noy

Blogs

Book Recommendations