Tout le monde dit toujours de profiler votre programme avant d'effectuer des optimisations, mais personne ne décrit jamais comment le faire.
Quelles sont vos pratiques pour profiler le code C?
En utilisant gcc
, je compile et crée un lien avec -pg
(comme expliqué par exemple ici ), puis continuez en exécutant le programme (selon les principes également suggérés à cette URL) et en utilisant gprof
. Les outils varieront si vous utilisez différents compilateurs & c, mais l'URL est toujours recommandée, même dans ce cas, pour les parties qui portent sur des idées générales sur comment et pourquoi profiler votre code.
Si vous utilisez Linux, je recommande la combinaison de ValGrind et CallGrind et KCacheGrind . ValGrind est une superbe méthode pour trouver des fuites de mémoire, et l'extension CallGrind fait un bon profileur.
[~ # ~] note [~ # ~]: Je viens de appris que ValGrind fonctionne désormais également sur Mac OSX. Cependant, CallGrind et KCacheGrind n'ont pas été mis à jour depuis 2005. Vous voudrez peut-être regarder autres frontaux .
Par souci d’achèvement, j’ajouterais oprofile . C'est particulièrement intéressant si vous voulez comparer le noyau.
Heureux que vous ayez demandé: -) Si cela ne vous dérange pas, vérifiez ces réponses:
Permettez-moi d'essayer de le résumer:
Le programme vous attend-il ou l'attendez-vous? Si cela ne vous fait pas attendre, alors vous n'avez pas de problème, alors laissez-le tranquille.
Si cela vous fait attendre, continuez.
Je recommande l'échantillonnage, qui consiste à obtenir des radiographies stroboscopiques de ce que fait le programme lorsqu'il est occupé (sans vous attendre). Obtenez des échantillons au moins de la pile d'appels, pas seulement du compteur de programmes. Si vous n'obtenez que des échantillons du compteur de programmes, cela n'aura aucun sens si votre programme passe beaucoup de temps en E/S ou en routines de bibliothèque, alors ne vous contentez pas de cela.
Si vous voulez obtenir beaucoup d'échantillons, vous avez besoin d'un profileur. Si vous n'en avez besoin que de quelques-uns, le bouton pause du débogueur fonctionne très bien. D'après mon expérience, 20 est plus que suffisant et 5 est souvent suffisant.
Pourquoi? Supposons que vous ayez 1000 échantillons de la pile d'appels. Chaque échantillon représente un ruban de temps d'horloge murale qui est passé uniquement parce que chaque ligne de code sur la pile l'a demandé . Donc, s'il y a une ligne de code qui apparaît sur 557 échantillons sur 1000, vous pouvez supposer qu'elle est responsable de 557/1000 du temps, donnez ou prenez quelques échantillons (15). Cela signifie que si le temps d'exécution complet vous coûtait 100 $, cette ligne en soi coûte 55,70 $, donnez ou prenez 1,50 $ **, vous devriez donc voir si vous en avez vraiment besoin.
Mais avez-vous besoin de 1000 échantillons? Si cette ligne coûte environ 55,7% du temps, alors si vous ne preniez que 10 échantillons, vous la verriez sur 6 d'entre eux, donner ou prendre 1,5 échantillon. Donc, si vous voyez une déclaration sur 6 échantillons sur 10, vous savez que cela vous coûte environ entre 45 $ et 75 $ sur ces 100 $. Même si cela ne coûte que 45 $, ne voudriez-vous pas voir si vous en avez vraiment besoin?
C'est pourquoi vous n'avez pas besoin de beaucoup d'échantillons - vous n'avez pas besoin de beaucoup de précision. Ce dont vous avez besoin, c'est de ce que les échantillons de pile vous donnent - ils vous indiquent précisément les lignes les plus précieuses à optimiser.
** L'écart type du nombre d'échantillons est sqrt( f * (1-f) * nsamp )
où f
est la fraction d'échantillons contenant la ligne.
Shark/Instruments (utilisant dtrace) sont les profileurs disponibles sur Mac. Ils sont plutôt bons.
Visual Studio Team System est livré avec un bon profileur. En outre, Intel VTune n'est pas mauvais.