Question

J'espère que tout le monde n'utilise pas Rational Purify.

Alors, que faites-vous lorsque vous souhaitez mesurer :

  • temps pris par une fonction
  • utilisation maximale de la mémoire
  • couverture de code

Pour le moment, nous le faisons manuellement [en utilisant des instructions de journal avec des horodatages et un autre script pour analyser le journal et le sortir dans Excel.phew...)

Que recommanderais-tu?Pointer vers des outils ou des techniques serait apprécié !

MODIFIER:Désolé, je n'ai pas précisé l'environnement en premier, C'est simple C sur un mobile propriétaire plate-forme

Était-ce utile?

La solution

Vous souhaitez probablement différents outils pour le profilage des performances et la couverture du code.

Pour le profilage, je préfère Shark sur MacOSX.C'est gratuit chez Apple et très bon.Si votre application est Vanilla C, vous devriez pouvoir l'utiliser, si vous pouvez vous procurer un Mac.

Pour le profilage sous Windows, vous pouvez utiliser LTPrf.Pas cher, mais pas génial :http://successfulsoftware.net/2007/12/18/optimising-your-application/

(Je pense que Microsoft se tire vraiment une balle dans le pied en ne fournissant pas un profileur décent avec les versions moins chères de Visual Studio.)

Pour la couverture, je préfère Coverage Validator sous Windows :http://successfulsoftware.net/2008/03/10/coverage-validator/Il met à jour la couverture en temps réel.

Autres conseils

J'ai fait ça beaucoup.Si vous avez un IDE ou un ICE, il y a une technique cela demande un certain effort manuel, mais fonctionne sans faute.

Avertissement:les programmeurs modernes détestent ça, et je vais être critiqué.Ils adorent leurs outils.Mais cela fonctionne vraiment et vous n’avez pas toujours les bons outils.

Je suppose que dans votre cas, le code est quelque chose comme un DSP ou une vidéo qui s'exécute avec une minuterie et doit être rapide.Supposons que ce que vous exécutez à chaque tick de minuterie soit le sous-programme A.Écrivez du code de test pour exécuter le sous-programme A dans une boucle simple, disons 1 000 fois, ou suffisamment longtemps pour vous faire attendre au moins plusieurs secondes.

Pendant son exécution, arrêtez-le de manière aléatoire avec une touche pause, échantillonnez la pile d'appels (pas seulement le compteur du programme) et enregistrez-la.(C'est la partie manuelle.) Faites cela plusieurs fois, par exemple 10.Une fois ne suffit pas.

Recherchez maintenant les points communs entre les exemples de pile.Recherchez toute instruction ou instruction d’appel qui apparaît sur au moins 2 échantillons.Il y en aura beaucoup, mais certains d'entre eux seront dans un code que vous pourrez optimiser.

Faites-le et vous obtiendrez une belle accélération, garantie.Les 1000 itérations prendront moins de temps.

La raison pour laquelle vous n’avez pas besoin de beaucoup d’échantillons est que vous ne recherchez pas de petites choses.Comme si vous voyez une instruction d’appel particulière sur 5 échantillons sur 10, elle est responsable d’environ 50 % du temps d’exécution total.Davantage d'échantillons vous indiqueraient plus précisément quel est le pourcentage, si vous voulez vraiment le savoir.Si vous êtes comme moi, tout ce que vous voulez savoir, c'est où il se trouve, afin de pouvoir le réparer et passer au suivant.

Faites cela jusqu'à ce que vous ne trouviez plus rien à optimiser et que vous soyez à ou près de votre vitesse maximale.

Pour les applications complexes, je suis un grand fan d'Intel Vtune.Il s'agit d'un état d'esprit légèrement différent de celui d'un profileur traditionnel qui instrumente le code.Il fonctionne en échantillonnant le processeur pour voir où se trouve le pointeur d'instruction 1 000 fois par seconde.Il présente l'énorme avantage de ne nécessiter aucune modification de vos binaires, ce qui, le plus souvent, modifierait le timing de ce que vous essayez de mesurer.

Malheureusement, cela n'est pas bon pour .net ou Java car il n'existe aucun moyen pour Vtune de mapper le pointeur d'instruction sur un symbole comme c'est le cas avec le code traditionnel.

Il vous permet également de mesurer toutes sortes d'autres mesures centrées sur le processeur/matériel, telles que les horloges par instruction, les succès/échecs du cache, les succès/échecs TLB, etc., qui vous permettent d'identifier pourquoi certaines sections de code peuvent prendre plus de temps à s'exécuter que vous ne le feriez. attendez-vous simplement en inspectant le code.

Si vous utilisez un système "C" intégré "sur le métal" (je ne suis pas sûr de ce que "mobile" impliquait dans votre message), alors vous disposez généralement d'une sorte de minuterie ISR, dans laquelle il est assez facile d'échantillonner l'adresse de code à laquelle l'interruption s'est produite (en fouillant dans la pile ou en consultant les registres de liens ou autre).Il est ensuite trivial de créer un histogramme d'adresses avec une combinaison de granularité/gamme d'intérêt.

Il n'est généralement pas trop difficile de concocter une combinaison de feuilles de code/script/Excel qui fusionne le nombre de vos histogrammes avec les adresses de votre fichier de symbole/liste de liaison pour vous donner des informations de profil.

Si vous êtes très limité en RAM, il peut être un peu difficile de collecter suffisamment de données pour que cela soit à la fois simple et utile, mais vous devrez nous en dire plus sur votre plate-forme.

nProf - Gratuit, fait ça pour .NET.

Fait le travail, au moins assez pour voir le 80/20.(20 % du code, prenant 80 % du temps)

Windows (.NET et Ex natifs) : AQHeure est un excellent outil pour l'argent.Autonome ou en tant que plugin Visual Studio.

Java:je suis fan de JProfiler.Encore une fois, peut fonctionner de manière autonome ou en tant que plugin Eclipse (ou divers autres IDE).

Je crois que les deux ont des versions d'essai.

Le Outils de performances Google sont extrêmement utiles à cet égard.

j'utilise partenaire de développement avec MSVC 6 et XP

Comment les outils fonctionneront-ils si votre plate-forme est un système d’exploitation propriétaire ?Je pense que tu fais de ton mieux en ce moment

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top