150 votes

Au-delà de l'échantillonnage en pile: profileurs C ++

Un Hacker du Conte

La date est 12/02/10. Les jours avant Noël sont dégoulinants de suite et j'ai vraiment frappé un grand bloc de route en tant que programmeur informatique. J'ai été en utilisant AQTime, j'ai essayé de la somnolence, brillant, et très somnolent, et comme nous parlons, VTune est en cours d'installation. J'ai essayé d'utiliser le VS2008 profiler, et il a été positivement punir ainsi que souvent insensible. J'ai utilisé le hasard pause technique. J'ai examiné l'appel d'arbres. J'ai tiré la fonction trace. Mais le plus triste, douloureux, fait de la question est que l'application que je suis en train de travailler avec plus d'un million de lignes de code, avec probablement un autre million de lignes vaut la peine d'applications de tierce partie.

J'ai besoin de meilleurs outils. J'ai lu les autres sujets. J'ai essayé de chaque générateur de profils répertoriés dans chaque rubrique. Il n'y a tout simplement avoir quelque chose de mieux que ces junky et options dispendieuses, ou ridicule quantités de travail pour presque aucun gain. Pour compliquer les choses, notre code est fortement lié, et organise un certain nombre d'Événement de Qt boucles, dont certains sont tellement fragiles qu'elles écrasent sous la lourde instrumentation en raison de retards de synchronisation. Ne me demandez pas pourquoi nous sommes en cours d'exécution à des événements multiples boucles. Personne ne peut me dire.

Sont-il des options plus le long des lignes de Valgrind dans un environnement windows?
Est-il rien de mieux que le long couloir d'outils cassés, j'ai déjà essayé?
Est-il quelque chose conçu pour s'intégrer avec Qt, peut-être avec une durée d'affichage des événements dans la file d'attente?

Une liste complète des outils que j'ai essayé, avec ceux qui ont été vraiment utile en italique:

  • AQTime: Plutôt bonne! A quelques difficultés avec la profondeur de récursivité, mais le graphe d'appel est correct dans ces cas, et peuvent être utilisés pour éliminer toute confusion que vous pourriez avoir. Pas un outil parfait, mais vaut la peine d'essayer. Il peut répondre à vos besoins, et, il a certainement été assez bon pour moi la plupart du temps.
  • Aléatoire Pause attaque en mode débogage: Pas assez d'informations suffisamment de temps.
    Un bon outil mais pas une solution complète.
  • En parallèle Studios: L'option nucléaire. Discret, bizarre, et follement puissant. Je pense que vous devriez frapper les 30 jours d'évaluation, et de déterminer si c'est un bon ajustement. C'est juste sacrément cool, trop.
  • AMD Codeanalyst: Merveilleux, facile à utiliser, très crash-couchée, mais je pense que c'est un environnement de chose. Je vous recommande de l'essayer, c'est gratuit.
  • Luc Stackwalker: Fonctionne très bien sur les petits projets, c'est un peu essayer de le faire fonctionner sur la nôtre. Quelques bons résultats, et il remplace définitivement Endormie pour mes tâches personnelles.
  • PurifyPlus: Pas de support pour windows-x64 environnements, le plus en évidence Windows 7. Par ailleurs excellent. Un certain nombre de mes collègues des autres départements, ne jurent que par elle.
  • VS2008 Profiler: Produit une sortie dans les 100+concerts de gamme dans la fonction de mode trace à la résolution requise. Sur le côté positif, produit de solides résultats.
  • GProf: Nécessite de la GCC pour être, même modérément efficace.
  • VTune: VTune W7 soutien frontières pénale. Sinon excellent
  • PIN: j'aurais besoin de pirater mon propre outil, donc c'est une sorte de dernier recours.
  • Sleepy\VerySleepy: Utile pour les petites applications, mais à défaut de moi ici.
  • EasyProfiler: Pas mal si vous n'avez pas l'esprit un peu de manuellement le code injecté pour indiquer où instrument.
  • Valgrind: *nix seulement, mais très bon quand vous êtes dans cet environnement.
  • OProfile: Linux uniquement.
  • Proffy: Ils tirent les chevaux sauvages.

Suggéré des outils que je n'ai pas essayé:

  • XPerf:
  • Glowcode:
  • Devpartner:

Notes: Environnement Intel pour le moment. VS2008, bibliothèques boost. Qt 4+. Et le misérable humdinger de tous: Qt/MFC intégration par trolltech.


Aujourd'hui: Près de deux semaines plus tard, il semble que mon problème est résolu. Grâce à une variété d'outils, y compris presque tout sur la liste et un couple de mes astuces, nous avons trouvé la primaire les goulets d'étranglement. Cependant, je vais continuer à le tester, explorer et d'essayer une nouvelle profileurs ainsi que les nouvelles technologies. Pourquoi? Parce que, je le dois à vous les gars, parce que vous les gars rock. Il peut ralentir le scénario un peu, mais je suis toujours très heureux de continuer à essayer de nouveaux outils.

Synopsis
Parmi beaucoup d'autres problèmes, un certain nombre de composants a récemment été mis sur le mauvais modèle de thread, causant de graves hang-ups en raison du fait que le code en dessous de nous est tout à coup plus multithread. Je ne peux pas en dire plus parce qu'il viole ma NDA, mais je peux vous dire que cela n'aurait jamais été trouvé par simple inspection ou même par rapport à la normale de la revue de code. Sans profileurs, callgraphs, et au hasard en s'arrêtant en parallèle, nous serions toujours à crier notre fureur à la belle bleue arc du ciel. Heureusement, je travaille avec certains des meilleurs hackers j'ai jamais rencontré, et j'ai accès à un incroyable verset plein de bons outils et des gens formidables.

Gentlefolk, je l'apprécie énormément, et le seul regret que je n'ai pas assez de rep pour récompenser chacun de vous avec un bounty. Je pense toujours que c'est une question importante pour obtenir une meilleure réponse que ceux que nous avons eu jusqu'à présent sur.

En conséquence, chaque semaine, pour les trois prochaines semaines, je vais mettre en place la plus grande générosité je peux me permettre, et l'attribution à la réponse avec les plus beaux outil que je pense n'est pas commun de connaissances. Après trois semaines, nous espérons avoir accumulé un profil définitif de la profileurs, si vous me pardonnez ma beaucoup les jeux de mots.

À emporter
Utiliser un profiler. Qu'ils sont assez bons pour Ritchie, Kernighan, Bentley, et Knuth. Je ne se soucie pas qui vous pensez que vous êtes. Utiliser un profiler. Si celui que vous avez reçu ne fonctionne pas, trouver un autre. Si vous ne pouvez pas en trouver un, code. Si vous ne pouvez pas le code de l'une, ou c'est un petit raccrocher, ou vous êtes juste coincé, l'utilisation aléatoire de la pause. Si tout le reste échoue, embaucher des étudiants diplômés pour bang un profiler.


Une Vision À Long Terme
Alors, j'ai pensé qu'il pourrait être agréable d'écrire un peu une rétrospective. J'ai opté pour un travail en profondeur avec la Parallèle Studios, en partie parce qu'il est en fait construit sur le dessus de la BROCHE de l'Outil. Ayant eu académique des relations avec certains des chercheurs impliqués, j'ai senti que c'était probablement une marque de qualité. Heureusement, j'ai droit. Alors que le GUI est un peu terrible, j'ai trouvé des adresses ip à être incroyablement utile, bien que je ne peux pas confortablement le recommande pour tout le monde. Critique, il n'y a pas de moyen évident pour obtenir la ligne de collision au niveau des comtes, quelque chose que l'AQT et un certain nombre d'autres profileurs de fournir, et je l'ai trouvé très utile pour l'examen des taux de la branche de sélection parmi d'autres choses. En net, j'ai apprécié l'aide AQTime ainsi, et j'ai trouvé leur soutien pour être vraiment réactif. Encore une fois, je me qualifier ma recommandation: beaucoup de leurs fonctionnalités ne fonctionnent pas bien, et certains d'entre eux sont carrément crash sujettes à Win7x64. XPerf également effectué de façon admirable, mais est atrocement lent pour l'échantillonnage de détail requis pour obtenir un bon lit sur certains types d'applications.

Maintenant, je dois dire que je ne pense pas qu'il y a une option définitive pour le profilage de code C++ dans un W7x64 de l'environnement, mais il y a certainement des options qui ne parviennent tout simplement pas à effectuer tout service utile.

68voto

deft_code Points 19418

D'abord:

Le temps d'échantillonnage des profileurs sont plus robustes que les CPU d'échantillonnage des profileurs. Je ne suis pas très familier avec les outils de développement Windows donc je ne peux pas dire que ceux qui sont qui. La plupart des profileurs de l'UC de l'échantillonnage.

Un PROCESSEUR d'échantillonnage profiler attrape une trace de la pile tous les N instructions.
Cette technique permet de révéler des parties de votre code qui sont liées à l'UC. Ce qui est génial si c'est le col de la bouteille dans votre application. Pas si grand, si votre threads de l'application passent la plupart de leur temps à se battre pour un mutex.

Un temps d'échantillonnage de profiler attrape une trace de la pile toutes les N secondes.
Cette technique permettra de zéro dans sur la "lenteur" de code. Si la cause est liée à l'UC, le blocage de IO lié, mutex lié, ou cache raclée sections de code. En bref ce morceau de code est en train de ralentir votre demande sera hors concours.

Il faut donc utiliser un temps d'échantillonnage de profiler si possible, en particulier lorsque le profilage fileté code.

Deuxième:

L'échantillonnage des profileurs de générer des masses de données. Les données sont très utiles, mais il est souvent trop facilement être utile. Un profil de données visualizer aide énormément ici. Le meilleur outil que j'ai trouvé pour le profil de visualisation de données est gprof2dot. Ne laissez pas le nom vous tromper, il s'occupe de toutes sortes d'échantillonnage de sortie du générateur de profils (AQtime, de la Somnolence, XPerf, etc). Une fois la visualisation a souligné la délinquance fonction(s), revenir à la crue de données de profil pour obtenir de meilleurs conseils sur ce que la cause réelle est.

Le gprof2dot outil génère un graphique par points description qui vous sont ensuite intégrées dans un graphviz outil. La sortie est au fond une callgraph avec des fonctions codées par couleurs, par leur impact sur la demande. alt text

Quelques conseils pour obtenir gprof2dot pour générer des résultats agréables.

  • J'utilise un --skew de 0,001 sur mon écran donc je peux facilement voir le chaud chemins de code. Sinon, l' int main() domine le graphique.
  • Si vous faites quelque chose de fou avec les modèles C++, vous voudrez probablement ajouter --strip. Cela est particulièrement vrai coup de pouce.
  • J'utilise OProfile pour générer mes données d'échantillonnage. Pour obtenir un bon de sortie j'ai besoin de le configurer pour charger les symboles de débogage à partir de ma 3ème partie et les bibliothèques système. Assurez-vous de faire de même, sinon, vous allez voir que le CRT est de prendre 20% de votre application, quand ce qui se passe réellement est - malloc est bousiller le tas et de manger jusqu'à 15%.

17voto

Mike Dunlavey Points 25419

Ce qui s'est passé lorsque vous avez essayé aléatoire pause? Je l'utilise tout le temps sur un monstre app. Vous avez dit qu'il n'a pas donné suffisamment d'informations, et vous l'avez suggéré, vous avez besoin de haute résolution. Parfois les gens ont besoin d'un peu d'aide dans la compréhension de la façon de l'utiliser.

Ce que je fais, en vertu de la VS, est de configurer la pile d'affichage de sorte qu'il n'affiche pas les arguments de la fonction, parce que cela rend la pile d'affichage totalement illisible, de l'OMI.

Puis-je prendre environ 10 échantillons en appuyant sur "pause" pendant le temps de me faire attendre. J'utilise ^A, ^C, et ^V pour copier dans le bloc-notes, pour référence. Puis-je étudier à chacun, pour essayer de comprendre ce qu'il était en train d'accomplir à l'époque.

Si elle essayait d'accomplir quelque chose sur les 2 échantillons ou plus, et que la chose n'est pas strictement nécessaire, puis j'ai trouvé un live de problème, et je sais à peu près combien de fixation, il permettra d'économiser.

Il y a des choses que vous n'avez pas vraiment besoin de savoir, comme le précise les pourcentages ne sont pas importants, et ce qui se passe à l'intérieur de la 3e partie du code n'est pas important, parce que vous ne pouvez pas faire quelque chose à propos de ces. Ce que vous pouvez faire quelque chose au sujet est la richesse de l'ensemble de l'appel de points dans le code, vous pouvez modifier affiché sur chaque pile de l'échantillon. C'est votre terrain de chasse.

Des exemples de types de choses que je trouve:

  • Pendant le démarrage, il peut être d'environ 30 couches de profondeur, dans le processus d'essayer d'extraire internationalisation des chaînes de caractères à partir de la DLL de ressources. Si les chaînes sont examinés, il peut facilement s'avérer que les chaînes n'ont pas vraiment besoin d' être internationalisé, comme ils sont des chaînes de caractères l'utilisateur ne voit réellement.

  • Lors de l'utilisation normale, un peu de code innocemment définit une modification de la propriété de certains objets. Cet objet provient d'une super-classe qui intègre le changement et déclenche les notifications qui se propagent tout au long de l'ensemble de la structure des données, la manipulation de l'INTERFACE utilisateur, la création et la desroying obects dans les façons difficile à prévoir. Cela peut se produire beaucoup de choses, les conséquences les plus inattendues de notifications.

  • Remplir une feuille de calcul ligne par ligne, cellule par cellule. Il s'avère que si vous construisez la ligne tout à la fois, à partir d'un tableau de valeurs, c'est beaucoup plus rapide.

P. S. Si vous êtes en multi-thread, lorsque vous faites une pause, tous les threads pause. Jetez un oeil à la pile des appels de chaque thread. Les Chances sont, un seul d'entre eux est le vrai coupable, et les autres sont au ralenti.

8voto

Adam Rosenfield Points 176408

J'ai eu un certain succès avec AMD CodeAnalyst .

8voto

JimR Points 4816

Avez-vous une fonction MFC OnIdle? Dans le passé, j'avais une application en temps quasi-réel que je devais corriger, qui laissait tomber des paquets série à une vitesse de 19,2 K qu'un PentiumD aurait dû être capable de suivre. La fonction OnIdle était ce qui tuait les choses. Je ne suis pas sûr que QT ait ce concept, mais je vérifierais cela aussi.

4voto

Alex Budovski Points 8932

Re le VS Profiler, si cela génère des fichiers volumineux, peut-être que votre intervalle d'échantillonnage est trop fréquentes? Essayez de diminuer, ce que probablement vous avez assez d'échantillons de toute façon.

Et idéalement, assurez-vous que vous n'êtes pas à recueillir des échantillons jusqu'à ce que vous êtes en train d'exercer la zone à problème. Donc, commencer avec de la collection pause, votre programme pour faire son "activité lente", puis commencer la collection. Vous avez seulement besoin d'au plus 20 secondes de la collecte. Arrêt de la collecte après ce.

Cela devrait aider à réduire votre échantillon la taille des fichiers, et saisir uniquement ce qui est nécessaire pour votre analyse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X