Comment profilez-vous votre code?

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

Alors, que faites-vous quand vous voulez 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 parsingr le journal et la sortie pour excel. phew…)

Que recommanderais-tu? Pointant sur des outils ou des techniques serait apprécié!

EDIT: Désolé, je n’ai pas d’abord spécifié l’environnement, c’est son C en clair sur une plate-forme mobile propriétaire

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

Pour le profilage, je préfère Shark sur MacOSX. Il est gratuit de Apple et très bon. Si votre application est à la vanille C, vous devriez pouvoir l’utiliser si vous pouvez vous procurer un Mac.

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

(Je pense que Microsoft se tire vraiment dans le pied en ne fournissant pas un profileur décent avec les versions les 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.

J’ai souvent fait ça. Si vous avez un IDE ou une ICE, il existe une technique qui demande un certain effort manuel, mais qui fonctionne sans échec.

Attention: les programmeurs modernes détestent ça, et je vais être viré. Ils aiment 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 DSP ou vidéo qui fonctionne sur une timer et doit être rapide. Supposons que ce que vous exécutez à chaque tick de la timer soit le sous-programme A. Écrivez un code de test pour exécuter le sous-programme A dans une boucle simple, disons 1000 fois ou suffisamment longtemps pour vous faire attendre au moins plusieurs secondes.

Pendant qu’il est en cours d’exécution, arrêtez-le au hasard avec une touche de pause, échantillonnez la stack d’appels (pas uniquement le compteur de programme) et enregistrez-la. (C’est la partie du manuel.) Faites ceci plusieurs fois, comme 10. Une fois n’est pas suffisant.

Recherchez maintenant les points communs entre les échantillons de stack. Recherchez toute instruction ou instruction d’appel apparaissant sur au moins 2 échantillons. Il y en aura beaucoup, mais certains seront dans du code que vous pourriez optimiser.

Faites-le, et vous aurez une belle accélération, c’est garanti. 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. Plus d’échantillons vous indiqueraient plus précisément le pourcentage, si vous voulez vraiment 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-le jusqu’à ce que vous ne trouviez plus rien à optimiser et que vous atteigniez votre vitesse maximale.

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

Malheureusement, ce n’est pas bon pour .net ou java car il n’y a aucun moyen pour le Vtune de mapper le pointeur d’instruction sur le symbole comme il en existe avec le code traditionnel.

Il vous permet également de mesurer toutes sortes d’autres mésortingques centrées sur le processeur et le matériel, telles que le nombre d’heures par instruction, les réussites / occultations de cache, les occurrences TLB, etc. attendre juste en inspectant le code.

Si vous utilisez un système “C” intégré “sur le métal” (je ne suis pas tout à fait sûr de ce que “mobile” implique dans votre publication), vous disposez généralement d’une sorte de minuteur ISR, dans lequel il est assez facile de tester l’adresse de code à laquelle l’interruption s’est produite (en creusant dans la stack ou en regardant les registres de liaison ou autre). Il est alors sortingvial de créer un histogramme d’adresses à une combinaison de granularité / gamme d’intérêts.

Il n’est généralement pas trop difficile de concocter une combinaison de feuilles de code / script / Excel qui fusionne les comptes de votre histogramme avec les adresses de votre fichier de symbole / liste de l’éditeur de liens pour vous donner des informations sur votre profil.

Si vous êtes très limité en RAM, il peut être un peu pénible 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 – Free, le fait pour .NET.

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

Windows (.NET et Native Exes): AQTime 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 seul ou en tant que plug-in Eclipse (ou divers autres IDE).

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

Les Google Perftools sont extrêmement utiles à cet égard.

J’utilise devpartner avec MSVC 6 et XP

Comment des outils vont-ils fonctionner si votre plate-forme est un système d’exploitation propriétaire? Je pense que vous faites du mieux que vous pouvez en ce moment