Quel est votre outil de profilage préféré (pour C ++)

Jusqu’à présent, je n’ai utilisé que Rational Quantify. J’ai entendu de bonnes choses sur VTune d’Intel, mais je ne l’ai jamais essayé!

Edit: Je recherche principalement un logiciel qui instrumentera le code, comme je suppose que c’est à peu près le seul moyen d’obtenir de très bons résultats.


Voir également:

Quels sont les bons profileurs pour C ++ natif sous Windows?

Pour le développement Linux (bien que certains de ces outils puissent fonctionner sur d’autres plates-formes). Ce sont les deux grands noms que je connais, il y a beaucoup d’autres plus petits qui n’ont pas connu de développement actif depuis longtemps.

  • Valgrind
  • TAU – Utilitaires de réglage et d’parsing

Pour Linux: Google Perftools

  • Plus rapide que le valgrind (pas encore au grain fin)
  • Ne nécessite pas d’instrumentation de code
  • Belle sortie graphique (-> kcachegrind)
  • Est-ce que le profilage de la mémoire, le cpu-profiling, la vérification des fuites

Ma seule expérience de profilage du code C ++ est avec AQTime par AutomatedQA (maintenant SmartBear Software). Il dispose de plusieurs types de profileurs intégrés (performances, mémoire, descripteurs Windows, suivi des exceptions, parsing statique, etc.) et instrumente le code pour obtenir les résultats.

J’aimais bien l’utiliser – c’était toujours amusant de trouver les endroits où un petit changement de code pouvait améliorer considérablement les performances.

IMHO, échantillonner en utilisant un débogueur est la meilleure méthode. Tout ce dont vous avez besoin est un IDE ou un débogueur qui vous permet d’arrêter le programme. Il résout vos problèmes de performances avant même d’avoir installé le profileur.

J’ai beaucoup utilisé Glowcode par le passé et je n’ai eu que des expériences positives. Son intégration à Visual Studio est vraiment sympa, et c’est le profileur le plus efficace / intuitif que j’ai jamais utilisé (même comparé aux profileurs pour le code managé).

Évidemment, cela ne sert à rien si vous ne travaillez pas sous Windows, mais la question ne me permet pas de savoir exactement quelles sont vos exigences.

Le profileur dans Visual Studio 2008 est très bon: rapide, convivial, clair et bien intégré dans l’EDI.

Je n’ai jamais fait de profilage auparavant. Hier, j’ai programmé une classe ProfilingTimer avec un horaire statique (une carte ) pour le stockage de l’heure.

Le constructeur stocke la coche de départ et le destructeur calcule le temps écoulé et l’ajoute à la carte:

ProfilingTimer::ProfilingTimer(std::ssortingng name) : mLocalName(name) { sNestedName += mLocalName; sNestedName += " > "; if(sTimetable.find(sNestedName) == sTimetable.end()) sTimetable[sNestedName] = 0; mStartTick = Platform::GetTimerTicks(); } ProfilingTimer::~ProfilingTimer() { long long totalTicks = Platform::GetTimerTicks() - mStartTick; sTimetable[sNestedName] += totalTicks; sNestedName.erase(sNestedName.length() - mLocalName.length() - 3); } 

Dans chaque fonction (ou {bloc}) que je veux profiler, je dois append:

 ProfilingTimer _ProfilingTimer("identifier"); 

Cette ligne est un peu lourde à append à toutes les fonctions que je veux profiler car je dois deviner quelles fonctions prennent beaucoup de temps. Mais cela fonctionne bien et la fonction d’impression indique le temps consommé en%.

(Quelqu’un d’autre travaille-t-il avec un “profilage maison” similaire? Ou est-ce juste stupide? Mais c’est amusant! Quelqu’un at-il des suggestions d’amélioration?

Y a-t-il une sorte d’ajout automatique d’une ligne à toutes les fonctions?)

oprofile, sans aucun doute; c’est simple, fiable, fait le travail, et peut donner toutes sortes de belles ventilations de données.

Pour Windows, consultez Xperf . Il utilise un profil échantillonné, possède une interface utilisateur utile, et ne nécessite aucune instrumentation. Très utile pour dépister les problèmes de performance. Vous pouvez répondre à des questions telles que:

  • Qui utilise le plus de CPU? Accédez au nom de la fonction à l’aide de stacks d’appels.
  • Qui alloue le plus de mémoire?
  • Qui fait le plus de requêtes de registre?
  • Disque écrit? etc.

Vous serez assez surpris lorsque vous trouverez les goulots d’étranglement, car ils ne sont probablement pas là où vous vous attendiez!

Il existe différentes exigences pour le profilage. Le code instrumenté est-il correct ou devez-vous définir le code optimisé (ou même le code déjà compilé)? Avez-vous besoin d’informations de profil ligne par ligne? Quel système d’exploitation utilisez-vous? Devez-vous également profiler les bibliothèques partagées? Qu’en est-il de la trace dans les appels système?

Personnellement, j’utilise oprofile pour tout ce que je fais, mais ce n’est peut-être pas le meilleur choix dans tous les cas. Vtune et Shark sont également excellents.

Comme vous ne mentionnez pas la plate-forme sur laquelle vous travaillez, je vais dire cachegrind sous Linux. Absolument. Cela fait partie du jeu d’outils Valgrind.

http://valgrind.org/info/tools.html

Je n’ai jamais utilisé sa sous-fonctionnalité Callgrind, car la plupart de mon optimisation de code concerne les fonctions internes .

Notez qu’il existe un frontend KCachegrind disponible.

Pour le développement Windows, j’ai utilisé Performance Validator de Software Verification – rapide, raisonnablement précis et à un prix raisonnable. Mieux encore, il peut instrumenter un processus en cours d’exécution et vous permet d’activer et de désactiver la collecte de données à l’exécution, manuellement et sur la base de l’appel, ce qui est idéal pour profiler une petite section d’un programme plus vaste.

J’utilise devpartner pour la plate-forme pc.

J’ai essayé Quantify a AQTime, et Quantify a gagné en raison de ses fonctions «focus on sub tree» et «delete sub tree» inestimables.

La seule réponse sensible est PTU d’Intel. Bien sûr, il est préférable de l’utiliser sur un processeur Intel et d’obtenir des résultats encore plus précieux au moins sur une machine C2D, car l’architecture elle-même est plus facile à restituer à des profils significatifs.

J’ai utilisé VTune sous Windows et Linux pendant de nombreuses années avec de très bons résultats. Les versions ultérieures ont empiré, quand ils ont externalisé ce produit à leur équipe de développement russe, la qualité et les performances ont toutes deux diminué (augmentation des pannes de VTune, souvent 15 minutes pour ouvrir un fichier d’parsing).

En ce qui concerne l’instrumentation, vous pouvez découvrir que c’est moins utile que vous le pensez. Dans le type d’applications sur lesquelles j’ai travaillé, l’ajout de l’instrumentation ralentit souvent le produit au point qu’il ne fonctionne plus (histoire vraie: lancez l’application, rentrez chez vous, revenez le lendemain, application toujours en cours d’initialisation). De plus, avec le profilage non instrumenté, vous pouvez réagir à des problèmes réels. Par exemple, avec le collecteur de date distant VTune, je peux lancer une session d’échantillonnage sur un serveur en direct avec des centaines de connexions simultanées qui rencontrent des problèmes de performances et des problèmes de production que je ne pourrais jamais répliquer dans un environnement de test.

Pour Windows, j’ai essayé AMD Codeanalyst, Intel VTune et le profileur dans Visual Studio Team Edition.

Codeanalyst est bogué (plante fréquemment) et sur mon code, ses résultats sont souvent inexacts. Son interface utilisateur n’est pas intuitive. Par exemple, pour atteindre l’affichage de la stack d’appels dans les résultats du profil, vous devez cliquer sur l’onglet “Processus”, puis sur le nom de fichier EXE de votre programme, puis sur un bouton de la barre d’outils contenant les minuscules “CSS”. Mais c’est un logiciel gratuit, alors vous pouvez aussi l’essayer, et cela fonctionne (avec moins de fonctionnalités) sans processeur AMD.

VTune (700 $) a une interface utilisateur terrible IMO; Dans un programme volumineux, il est difficile de trouver l’arbre d’appel particulier que vous voulez, et vous ne pouvez regarder qu’un seul «nœud» dans un programme à la fois (une fonction avec ses appelants immédiats et ses destinataires). arbre d’appel. Il y a une vue de graphe d’appel, mais je n’ai pas pu trouver un moyen de faire apparaître les temps d’exécution relatifs sur le graphique. En d’autres termes, les fonctions du graphique se ressemblent, peu importe le temps passé sur elles – c’est comme si elles manquaient totalement le sharepoint profilage.

Le profileur de Visual Studio possède la meilleure interface graphique des trois, mais pour une raison quelconque, il est impossible de collecter des échantillons de la majorité de mon code (les échantillons ne sont collectés que pour quelques fonctions de tout mon programme C ++). De plus, je ne pouvais pas trouver un prix ou un moyen de l’acheter directement; mais il vient avec l’abonnement MSDN de mon entreprise. Visual Studio prend en charge les codes gérés, natifs et mixtes; Je ne suis pas certain des deux autres profileurs à cet égard.

En conclusion, je ne connais pas encore de bon profileur! Je suis sûr de vérifier les autres suggestions ici.

ElecsortingcFence fonctionne parfaitement pour le débogage malloc

Mon outil préféré est Easy Profiler: http://code.google.com/p/easyprofiler/

C’est un profileur de compilation: le code source doit être instrumenté manuellement à l’aide d’un ensemble de routines afin de décrire les régions cibles. Cependant, une fois l’application exécutée et les mesures écrites automatiquement dans un fichier XML, il suffit d’ouvrir l’application Observer et d’effectuer quelques clics sur les outils d’parsing / comparaison avant de pouvoir voir le résultat dans un tableau qualitatif.

Visual Studio 2010 profiler sous Windows. VTune avait un excellent outil de graphe d’appel, mais il a été cassé à partir de Windows Vista / 7. Je ne sais pas s’ils l’ont réparé.

Permettez-moi de donner un aperçu de EQATEC … juste ce que je cherchais … simple à apprendre et à utiliser et me donne les informations dont j’ai besoin pour trouver rapidement les points chauds. Je le préfère beaucoup à celui intégré à Visual Studio (même si je n’ai pas encore essayé celui de VS 2010, pour être juste).

La capacité de prendre des instantanés est énorme. J’obtiens souvent une parsing et une optimisation supplémentaires en attendant que l’parsing de la cible réelle s’exécute … j’adore.

Oh, et sa version de base est gratuite!
http://www.eqatec.com/Profiler/