2009-11-20 3 views
2

En quelque sorte lié à this question, quel outil recommanderiez-vous pour évaluer les données de profilage créées avec callgrind?Outils pour évaluer les profils d'appel de callgrind?

Il n'est pas nécessaire d'avoir une interface graphique, mais il doit préparer les résultats de manière concise, claire et facile à interpréter. Je sais par exemple kcachegrind, mais ce programme manque certaines fonctionnalités telles que l'exportation de données des tables affichées ou simplement copier des lignes de l'affichage.

Répondre

1

Il ya quelques années j'ai écrit un profileur pour fonctionner sous DOS.

Si vous utilisez KCacheGrind, voici ce que je voudrais qu'il fasse. Ce n'est peut-être pas trop difficile de l'écrire, ou vous pouvez le faire à la main. KCacheGrind dispose d'un bouton de barre d'outils "Forcer le vidage", avec lequel vous pouvez déclencher un vidage manuellement à un moment aléatoire. La capture de traces de pile à des moments aléatoires ou pseudo-aléatoires, dans l'intervalle où vous attendez le programme, est le cœur de la technique.

Pas beaucoup d'échantillons sont nécessaires - 20 est généralement plus que suffisant. Si un goulot d'étranglement coûte une grande quantité, comme plus de 50%, 5 échantillons peuvent suffire.

Le traitement des échantillons est très simple. Chaque trace de pile consiste en une série de lignes de code (en réalité des adresses), où toutes sauf la dernière sont des appels de fonction/méthode.

  • Collectez une liste de toutes les lignes de code qui apparaissent sur les échantillons et éliminez les doublons.

  • Pour chaque ligne de code, comptez la fraction d'échantillons sur laquelle elle apparaît. Par exemple, si vous prenez 20 échantillons et que la ligne de code apparaît sur 3 d'entre eux, même si elle apparaît plus d'une fois dans un échantillon (en raison de la récursivité), le nombre est de 3/20 ou 15%. C'est une mesure directe du coût de chaque déclaration.

  • Afficher la plus coûteuse des 100 lignes de code. Vos goulots d'étranglement sont dans cette liste.

Ce que je fais habituellement avec ces informations est de choisir une ligne avec un coût élevé, et puis prendre manuellement des échantillons de la pile jusqu'à ce qu'il apparaisse (ou regarder ceux que j'ai déjà), et je me demande: « Pourquoi est il fait cette ligne de code, pas seulement dans un sens local, mais dans un sens global. " Une autre façon de le dire est «Qu'est-ce que le programme essayait d'accomplir au moment où l'échantillon a été pris? La raison pour laquelle je pose cette question est parce que cela me dit s'il était vraiment nécessaire de dépenser ce que cette ligne coûte.

Je ne veux pas être critique de toutes les grandes personnes de travail ne développant profileurs, mais malheureusement, il y a beaucoup de mythe solidement ancré sur le sujet, y compris:

  • qui mesure précis, avec beaucoup d'échantillons, est important. Plutôt l'accent devrait être sur trouver les goulots d'étranglement. La mesure précise n'est pas une condition préalable à cela. Pour les goulets d'étranglement typiques, qui coûtent entre 10% et 90%, la mesure peut être assez grossière.

  • que les fonctions importent plus que des lignes de code. Si vous trouvez une fonction coûteuse, vous devez toujours chercher à l'intérieur des lignes qui sont le goulot d'étranglement. Cette information est juste là, dans les traces de la pile - pas besoin de chasser pour cela.

  • que vous avez besoin de distinguer l'UC de l'heure de l'horloge murale. Si vous l'attendez, c'est l'heure de l'horloge murale (temps de montre-bracelet?). Si vous avez un goulot d'étranglement constitué d'E/S parasites, par exemple, voulez-vous l'ignorer parce que ce n'est pas du temps CPU?

  • que la distinction entre temps exclusif et temps inclus est utile. Cela n'a de sens que si vous chronométrez les fonctions et vous voulez savoir si le temps n'est pas passé dans les callees. Si vous regardez les lignes de code, la seule chose qui compte est le temps inclusif. Une autre façon de le dire est que chaque instruction est une instruction d'appel, même si elle n'appelle que microcode.

  • cette récursivité est importante. Ce n'est pas pertinent, car cela n'affecte pas la fraction d'échantillons sur laquelle une ligne se trouve et est donc responsable.

  • que le nombre d'appels d'une ligne ou d'une fonction est important. Que ce soit rapide et appelé trop de fois, ou lent et appelé une fois, le coût est le pourcentage de temps qu'il utilise, et c'est ce que les échantillons de la pile estiment.

  • que la performance de l'échantillonnage est importante. Cela ne me dérange pas de prendre un échantillon de pile et de le regarder pendant plusieurs minutes avant de continuer, en supposant que cela ne fasse pas bouger les goulots d'étranglement.

Here's une explication plus complète.

1

Il existe des outils CLI pour travailler avec les données callgrind:

callgrind_annotate 

et un outil cachegrind qui peut montrer des informations de callgrind.out

cg_annotate 
Questions connexes