7
votes

Tous les profileurs sont-ils considérablement lents d'exécution?

Les profilers que j'ai de l'expérience (principalement le profileur Digital Mars D qui vient avec le compilateur) semblent ralentir massivement l'exécution du programme au profilé. Cela a un effet majeur sur ma volonté d'utiliser un profileur, car il fabrique du profilage d'une "réelle" de nombreux programmes, par opposition à des tests sur une très petite contribution, peu pratique. Je ne sais pas grand chose sur la manière dont les profileurs sont mis en œuvre. Est un ralentissement majeur (> 2x) lors du profilage à peu près une vie de la vie, ou existe-t-il des profileurs qui l'évitent? Si cela peut être évité, existe-t-il des profileurs rapides disponibles pour D, de préférence pour D2 et de préférence de préférence?


0 commentaires

4 Réponses :


16
votes

Je ne sais pas sur les profilers D, mais en général, il existe deux façons différentes un profileur peut collecter des informations de profilage.

Le premier est par instrumentation, en injectant des appels de journalisation dans tout le lieu. Cela ralentit l'application plus ou moins. Typiquement plus.

La seconde est l'échantillonnage. Ensuite, le profileur enfreint l'application à intervalles réguliers et inspecte la pile d'appels. Cela ne ralentit pas beaucoup l'application du tout.

L'inconvénient d'un profileur d'échantillonnage est que le résultat n'est pas aussi détaillé qu'avec un profileur d'instrumentation.

Vérifiez la documentation de votre profileur si vous pouvez exécuter avec échantillonnage au lieu de l'instrumentation. Sinon, vous avez de nouveaux termes de Google dans "Sampling" et "Instrument".


3 commentaires

++ Ouais, règles d'échantillonnage! Mais pas seulement un ancien échantillonnage. Échantillonnage de la pile d'appels, au moment de l'horloge de l'horloge et à la déclaration par ligne (non fonctionne) pourcentage des échantillons contenant cette ligne. Et le détail supplémentaire que vous obtenez avec l'instrumentation n'est que le bruit de toute façon, si votre objectif est de trouver du code nécessitant optimiser.


Pour cette raison, j'ai tendance à préférer fortement les profileurs d'échantillonnage partout où de la pratique - ils ont tendance à fournir de nombreuses données fiables pour un coût relativement moins important de la performance, et je peux l'exécuter longtemps à la moyenne des résultats d'un processus stochastique et bruyant ( Comme une fonction qui prend 1 ms 90% du temps, elle s'appelle et 500 ms les 10% 10%).


Je trouve le nombre d'appels de fonction exacts que les profileurs d'instrumentation donnent utile de temps à autre. Si je charge 120 clients dans une liste, je regarde les fonctions qui s'appellent 120 (et pire n x 120) fois. Je peux alors trouver des fonctions appelées par erreur (c'est-à-dire déclenchée par un événement). Ou des appels faits pour chaque élément où un appel pour tous devrait suffire.



1
votes

Je dirais que oui, les formes d'échantillonnage et d'instrumentation des formes de profilage vont taxer votre programme fortement - quel que soit le profileur dont vous utilisez, et sur quelle langue.


1 commentaires

De nombreux profileurs d'échantillonnage peuvent échifier à quel point ils prennent fréquemment leurs échantillons. Cela permet à la teneur en hauteur d'être considérablement inférieure au profilage d'instrumentation (de l'ordre de 1 à 5%). La qualité des données dépend du taux d'échantillonnage, bien sûr. Les deux formes de profilage ont des impacts non nuls, mais l'échantillonnage est nettement inférieur.



1
votes

Vous pouvez essayer H3R3tic's XFProf , qui est un profileur d'échantillonnage. Je ne l'ai pas essayé moi-même, mais ce gars fait toujours des choses cool :)

de la description:

Si le programme est échantillonné à quelques centaines de centaines (ou mille) fois par seconde, la surcharge de performance ne sera pas perceptible.


2 commentaires

Merci. Cela devrait être une amélioration (ne l'a pas encore testé), bien qu'il soit toujours dit que vous devez compiler des optimisations avec lesquelles il a probablement plus de 2x perf. Coût.


@dsimcha: @Torhu: Je viens de vérifier le site XFProf. Je suis triste. Il est construit sur les mêmes principes que GProf. Voici pourquoi cela me rend triste: Stackoverflow.com/Questtions/1777556/ Alternatives à-GProf / ...



2
votes

Ma méthode de profilage préférée ralentit le programme Way Way Down, et c'est bon. Je gère le programme sous le débogueur, avec une charge réaliste, puis je l'interrompais manuellement. Ensuite, je copie la pile d'appels quelque part comme un bloc-notes. Donc, il prend l'ordre de la minute pour collecter un échantillon . Ensuite, je peux ressusciter l'exécution, soit même bien de la démarrer depuis le début pour obtenir un autre échantillon.

Je fais cela 10 ou 20 fois, assez long pour voir ce que le programme fait réellement à partir d'une perspective murale. Quand je vois quelque chose qui montre beaucoup, alors je prends plus d'échantillons jusqu'à ce qu'il se présente à nouveau. Ensuite, j'arrête et vraiment étudie ce que c'est en train de faire et pourquoi, qui peut prendre 10 minutes ou plus. C'est comme ça que je découvre que cette activité est quelque chose que je peux remplacer par un code plus efficace, c'est-à-dire que ce n'était pas totalement nécessaire.

Vous voyez, je ne suis pas intéressé à mesurer à quel point cela va être rapide ou lent. Je peux le faire séparément avec peut-être seulement une montre. Je suis intéressé à trouver quelles activités prennent un grand pourcentage de temps (pas montant , pourcentage ), et si quelque chose prend un grand pourcentage de temps, c'est la probabilité que chaque StackShot le verra.

par "activité" Je ne veux pas nécessairement dire où le PC est suspendu. Dans un logiciel réaliste, le PC est presque toujours éteint dans un système ou une routine de bibliothèque quelque part. Typiquement plus important est des sites d'appels de notre code. Si je vois, par exemple, une chaîne de 3 appels montrant la moitié des échantillons de pile, cela représente une très bonne chasse, car si l'un de ceux-ci n'est pas vraiment nécessaire et peut être éliminé, le temps d'exécution tombera par la moitié.

Si vous voulez un gestionnaire de sourire, faites cela une ou deux fois.

Même dans ce que vous penseriez serait des applications crucheuses sur le nombre scientifique de math-lourdes, où vous penseriez une optimisation et des points chauds de faible niveau, vous savez ce que je trouve souvent? Les routines de la bibliothèque de mathématiques sont Vérification des arguments , pas de crunching. Souvent, le code ne fait pas ce que vous pensez que cela va, et vous n'avez pas à le gérer au maximum pour la découvrir.


4 commentaires

Moins utile Lorsque vous avez un profil plutôt plat où aucun composant ne prend plus de 2% du temps d'exécution en soi, mais vous devez avoir votre boucle principale de 40 ms à 33 ms en fixant cinquante petites choses. Mais c'est un cas assez spécialisé.


Vous devez également jeter un coup d'œil aux profileurs d'échantillonnage modernes. Je continue à vous les recommander non pas parce que je pense que votre méthode est médiocre, mais parce que je suis totalement d'accord avec votre approche et je suis heureux d'utiliser des outils automatiques pouvant le faire 1000 échantillons par seconde.


@Crashworks: Merci. Mon expérience est que vous ne comprenez que d'avoir de minuscules petites choses à optimiser après un processus de préparation de certaines choses assez massives que vous n'avez jamais deviné étaient là. En ce qui concerne les outils, je pense que zoomer et LTProf ont la bonne idée, mais comme j'ai essayé d'expliquer auparavant, vous n'avez pas besoin d'un grand nombre d'échantillons à moins que vos problèmes les plus gros ne soient vraiment vraiment petits. En outre, je ne connais aucun outil qui vous permet d'examiner en détail un échantillon de pile représentatif et le contexte du programme en vigueur au moment de sa prise. Cela vous donne une idée que les chiffres ne peuvent pas.


@Crashworks: Dans votre exemple, si la boucle fonctionne 1000 fois, vous voulez le moment d'aller de 40 à 33 ans. Cela signifie éliminer 18% de ce que cela fait. Si un cadre prend 40 ms, c'est assez de temps pour un arbre d'appel assez touffu, je voudrais donc veiller à ce qu'il n'y avait pas de branches que je pouvais emporter. Quand je ne descends que pour couper des feuilles, je suis proche du point de rédaction de rendements. Heureusement, il y a l'effet de grossissement. Toute amélioration que vous faites rend les opportunités restantes plus évidentes.