8
votes

Quel a été le profileur Windows C ++ le plus fiable et le plus rapide que vous avez utilisé?

J'ai besoin de profiler une application en temps réel C ++ sous Windows. La plupart des profilers disponibles sont soit terriblement coûteux, trop cher, ou les deux. Je n'ai pas besoin de choses .net. Comme il s'agit d'une application en temps réel, j'ai besoin que le profileur soit aussi vite que possible. Ce serait excellent s'il était intégré d'une certaine manière avec Visual Studio 2005/2008, mais ce n'est pas nécessaire. Si cette description vous rappelle un profileur que vous avez utilisé, j'aimerais vraiment savoir à ce sujet. J'espère tirer de l'utilisation des personnes des profileurs C ++ sur Windows pour identifier celui qui fera le travail. Merci.


2 commentaires

Qu'est-ce que vous voulez? Vous n'avez pas décidé de votre esprit, vraiment. Le titre indique que vos deux principales préoccupations sont la fiabilité et la rapidité. Celles-ci sont déjà en attente. Ensuite, dans votre deuxième phrase, vous ajoutez du prix et de la simplicité.


En termes de fiabilité, je voulais dire un qui ne se bloque pas, non pas de précision des résultats. C'est ce que je comprends que ce que je cherche est vraiment un profileur d'échantillonnage, car ils sont les moins invasifs. Le prix et la simplicité sont des considérations supplémentaires, car elles ont tous deux un effet direct sur le point de savoir s'il est logique d'ajouter le profileur à la boîte à outils métier.


7 Réponses :


3
votes

Quand je dois profiler le code en temps réel, je pense que la seule solution est quelque chose de roulé à la main. Vous ne voulez pas trop de couverture ou vous finissez par ralentir le code vers le bas, mais avec un petit ensemble de données, vous devez être très concentré, en choisissant essentiellement chaque point à la main.

J'ai donc écrit un fichier d'en-tête il y a plusieurs années qui définit certaines macros et un mécanisme permettant de capturer des données, soit comme des horaires de fonction, soit comme une timeline (à l'heure de la fonction X). Le code utilise QueryPerformEcanceCounter pour les timings et écrit les données dans la mémoire partagée nommée via CreateFilMapping donc que je peux regarder les données de synchronisation d'un autre processus en direct.

Il faut un recompilement pour modifier les informations de synchronisation que je veux capturer, mais le code est si peu coûteux qu'il n'a pratiquement aucun effet sur le code.

Tout le code est dans le fichier d'en-tête (avec des protections de macro, le code ne peut donc être inclus une fois). Donc, le fichier d'en-tête lui-même est mon «profileur». Je change des tables dans l'en-tête, puis sur le code cible, recompilez et commencez à profiler.


2 commentaires

D'accord. De plus, si vous n'avez pas besoin d'une analyse en temps réel, videz simplement QueryPerformCounter des résultats dans un tampon d'historique et à la fin du programme Sortie, un fichier CSV avec des valeurs converties en milli / microsecondes. Excel / OpenOffice est un outil optimiste pour les résultats graphiques.


Intéressant. Merci pour cela. Cela semble être la façon dont je vais aller, bien que d'autres réponses signalent, cela n'aide pas à identifier des points chauds.



2
votes

Donnez une considération sur le Option sans profiler .

C'est une sagesse commune concernant les problèmes de performance que la mesure est une condition préalable à les trouver.
pas si. Plus sur ce sujet.

Il s'agit d'un exemple de réglage d'une application pour une performance maximale. < / a>

Si vous êtes inquiet des frais généraux et comment faire cela dans une application DSP en temps réel, voici comment je le ferais. Faites-le courir avec une entrée réaliste et arrêtez-le simplement dans ses pistes avec le bouton Pause. Capturez la pile d'appels dans le bloc-notes. Puis recommencez-le et répétez plusieurs fois. (Jetez tout échantillon non pertinent, comme en attente de l'entrée de l'utilisateur ou autrement dans l'état de ralenti.) Notez que ce processus met zéro profilage surhead sur le programme.

Si vous avez le problème que votre code est désactivé une minuterie et ne fonctionne réellement que pour une petite fraction de l'heure globale, alors a) vous pouvez décider que vous n'avez pas vraiment de problème, ou b) vous pouvez essaie toujours de faire aller plus vite. Si (b) ensuite enveloppez une boucle autour de votre code afin que tout ce qu'elle le fait, il répète 10, 100 ou 1000 fois, ce qui en fait une fraction suffisamment importante de temps afin que les échantillons y atterrissent. Utilisez ces échantillons pour déterminer ce qu'il faut résoudre pour le rendre plus rapide. Lorsque vous avez terminé, retirez la boucle extérieure et elle fonctionnera comme un bandit.


9 commentaires

C'est un profileur d'échantillonnage - Le requin de l'outil OSX est un excellent profileur d'échantillonnage, malheureusement, je ne sais rien qui s'approche de Windows. Vtutune est un profileur, mais ce n'est pas génial imo (voir blog.vlad1.com/2008/07/16/why-Cant-vtune-be-more-Like-Shark )


@ Adam-Bowen: ça va y arriver. On dirait que cela capture des piles sur le temps d'horloge murale. Il n'est pas clair que vous pouvez facilement contraindre le travail pendant les périodes de lenteur subjective. Ce n'est pas clair si cela vous donne niveau de ligne pour cent de temps inclus. Ensuite, il y a la question que même les packshots peuvent ne pas être suffisantes d'informations sur l'état - rien ne se compare à l'obtention de vos doigts dans le code.


@ Adam-Bowen: Pour ceux qui veulent vraiment utiliser un outil de profilage, c'est-à-dire que je pense que tout va presque tout droit (bien que c'est sous Linux): ROTATTEURTHOM Il existe également les utilitaires UNIX utiles PSTACK et LSTACK - Il peut y avoir quelque chose comme ça pour OSX et Windows - I Don 't sais.


Intéressant, je n'ai pas vu celui-ci avant - pourrait lui donner une allée prochaine fois que nous faisons un cycle d'optimisation.


@ Adam-Bowen: J'ai eu une petite discussion avec eux: ROTATATERIGHT.COM /FORUM /index.php?topic=85.0


Merci. M'a pris assez de temps pour lire toutes les pages que vous avez liées, mais je garderai cela à l'esprit pour l'avenir. Il me semble que cette méthode complèterait assez bien la solution laminée à la main - la main enroulée une main serait bonne pour optimiser les sections de code tout en ignorant le reste. Celui-ci serait bon pour optimiser l'application en général. Je vais certainement donner celui-ci un essai.


@CARLEETO: J'espère que je ne vous ai pas piqué trop de matériel sur vous. L'idée de base est assez simple. Bonne chance.


Je seconde @adambowen. C'est exactement ce qu'est un profileur d'échantillonnage, mais il l'automasse pour vous.


@Ben: Le problème n'est pas dans la collection d'échantillons (si on finit par le mur, lequel ne le fait pas). Le problème est dans l'analyse des résultats. Il y a une liste de réponses aux objections ici . Ceci montre à quel point il est facile de se cacher d'un profileur, mais pas de la Échantillonnage manuel. Ceci montre pourquoi vous ne pouvez pas simplement dire "Oh bien, si nous manquons certains c'est bon." Vous payez un prix élevé pour ceux-ci.



0
votes

Comme il s'agit d'une application en temps réel, j'ai besoin que le profileur soit aussi rapide que possible.

Je ne sais pas ce que vous entendez en temps réel (dur, semi-dur, doux).

J'ai déjà dû améliorer les performances d'un serveur de fax. Le protocole de fax est tel que si l'extrémité retarde trop longtemps (certaines dizaines ou des centaines de millisecondes, selon), la session de fax est déconnectée. J'étais donc incapable d'utiliser un profileur commercial qui était disponible pour moi, car ils ont ralenti l'exécution du serveur trop: et j'ai donc ajouté divers messages de journal (avec des horodatages) pour instrument le code et trouver ainsi le cou de bouteilles .


1 commentaires

Je veux dire profiler une application de streaming audio avec une latence 1 ms.



1
votes

Nous faisons une juste quantité de profilage et avons utilisé Shark (OSX uniquement), VTUNE , GlowCode et l'ancien favori des comptoirs / horloges.

de ces requins est de loin le meilleur (et gratuit!), dans la mesure où j'essaie de garder le code portable à OSX afin que je puisse l'utiliser pour profiler. Malheureusement, cela ne répond pas à vos exigences.

Vtutune était totalement peu impressionnable, il était trop compliqué pour obtenir un profil décent de Sans être un expert dans ce que toutes les options de profilage, l'interface graphique avant s'est fréquemment écrasée ou tout simplement brisé et son échantillonneur ne goûte pas la pile d'appel. Rendre presque inutile de voir en réalité comment les goulots d'étranglement de votre programme proviennent. C'était également cher (bien que nous ayons fini par acheter une licence). En sa faveur, c'est une plate-forme croisée et vous pouvez obtenir un essai de 30 jours pour voir si vous l'aimez.

GlowCode était décent, Windows IIRC uniquement et propose également un essai gratuit. Cela fait longtemps que nous l'avons utilisé mais ce n'est peut-être pas un mauvais endroit pour commencer.

Nous utilisons surtout des horloges de notre code intégré, qui exécute un processus unique avec peu ou pas de surcharge de système - ce qui signifie que nous pouvons compter exactement le nombre d'opérations de cycles d'horloge. Personnellement, je ne recommanderais pas de «rouler votre propre» code de profil (sauf à une échelle extrêmement ) pour deux raisons:

  • Il est difficile de rendre compte de la planification de votre processus et de quelles autres opérations fonctionnent.
  • Les profilers soulignent souvent les points chauds que vous n'auriez jamais considéré comme des points chauds sans leur intervention.

3 commentaires

+1 Pour un bon post, mais en ce qui concerne le code intégré, j'ai cette histoire de guerre: Stackoverflow.com/questions/890222/... . Fondamentalement, il existe une opinion orthogonale que la mesure de mesure n'est qu'une distraction du processus de recherche de code qui a besoin d'optimiser.


Je suis d'accord sur l'échantillonnage, même si je préfère toujours utiliser un profileur pour faire du travail difficile pour moi (c'est-à-dire la résolution d'échantillonnage / appels de conversation, etc.). Mon problème majeur avec Vtutune est qu'il n'empile pas suffisamment d'informations pour déterminer quel est le problème. Lorsque j'ai utilisé le timing, il est généralement d'identifier une partie de l'algorithme qui se passe lentement (de même qu'un candidat à la recherche d'une meilleure complexité dans l'algorithme) plutôt que de rechercher des lignes de code à optimiser.


Merci. À ce jour, mon seul repliement a été de profiler sur Mac OS X en utilisant Shark. Je regardais les outils de Vtutune et de AMD, mais le fait que chacun ne fonctionne que avec leurs transformateurs m'a empêché. J'ai essayé GlowCode, mais cela m'a écrasé 6 fois au cours de l'évaluation, donc je ne suis pas susceptible de le prendre. AqTime a été le plus proche que je suis venu à obtenir un profileur qui fait ce dont j'avais besoin pour faire, mais j'ai eu quelques accidents de collision avec elle aussi.



0
votes

J'ai utilisé AMD CodeAnyste à un effet important, mais il faut naturellement exécuter sur un processeur AMD. C'est plus un cas de "vous dit plus que ce que vous voulez savoir" si vous creusez assez profondément. http://developer.amd.com/cpu/codeanalyste/pages/default. ASPX


1 commentaires

CodeAnalyste fonctionne bien sur Intel, mais uniquement le profilage basé sur la minuterie



1
votes

J'utilise occasionnellement une application appelée très somnolente: http://www.codersnotes.com/sleepy

C'est un outil simple et sans pareil, et je ne sais pas à quel point cela convient à vos besoins. Cela fait assez bien pour moi, comme un profileur d'échantillonnage assez simple. Je crée un profileur .NET appelé SlimTune qui gagnera finalement un soutien natif - mais ce n'est pas là maintenant, et cela pourrait être quelques mois avant sa disponibilité.


1 commentaires

J'ai essayé très somnolent. Cela me donne simplement des erreurs à ce sujet de ne pas pouvoir lancer le processus, il ne correspond pas non plus au processus..so, je suppose que je n'ai pas de chance là-bas.



2
votes

Validator Performance (à partir de la vérification du logiciel, la société que je travaille) semble correspondre à ce que vous recherchez:

  • Modes d'échantillonnage et de non-échantillonnage.
  • C, C ++, Delphi, Windows.

0 commentaires