J'ai un problème de profilage - imaginez que j'ai le code suivant ... Si je cours sous Vtutune (ou d'autres profilers), il est très difficile de repérer que tout est faux . Tous les points chauds apparaîtront dans la section marquée "// beaucoup de code" qui est déjà optimisée. Le badly_written_function () ne sera pas mis en évidence de quelque manière que ce soit la cause de tous les problèmes. P> Y a-t-il une caractéristique de Vtutue qui m'aidera à trouver le problème? P> Y a-t-il une sorte de mode dans lequel je peux trouver le temps pris par badly_written_function () et toutes ses sous-fonctions forte>? P> p> P>
4 Réponses :
Rouler votre propre Une chose déroulante non portable est de définir la fonction réelle () afin qu'elle fournisse suffisamment de granularité pour obtenir des temps valides. Cela fonctionne généralement pour moi (à l'aide de l'API Windows sous Cygwin): p> pour unix droit il y a le commun: p> Il existe également d'autres méthodes moins portables pour obtenir une granularité plus fine à l'aide de RDTSC; Voir par exemple http://fr.wikipedia.org/wiki/time_stamp_counter et ses liens , mais je n'ai pas essayé cela. p> edit: em> strong> La très belle réponse de RavensPoint semble être trop différente de la mienne. et em> strong> sa réponse utilise de jolies cordes descriptives, plutôt que des nombres laids, que j'étais souvent frustré par. Mais cela peut être corrigé avec seulement une douzaine de lignes supplémentaires (mais cela est presque double em> le nombre de lignes!). P> Notez que nous voulons éviter toute utilisation de MALLOC (), et je suis même un peu douteux à propos de STRCMP (). Donc, le nombre de tranches n'est jamais augmenté. Et les collisions de hachage sont simplement signalées, elles sont plutôt résolues: le profileur humain peut résoudre ce problème en heurtant manuellement le nombre de tranches de 30, ou en changeant la description. non testé em> fort> p> et un autre point est que vous voudrez généralement désactiver ce profilage pour libérer des versions; Cela s'applique également à la réponse de RavensPoint. Cela peut être fait par l'astuce d'utiliser une macro maléfique pour le définir: p> Si cela est terminé, vous devez bien entendu ajouter des parenthèses à la définition pour désactiver La macro désactivée: p> void (profileCpuUsage)(const char *description)...
C'est généralement appelé "profil de callgraph", et je suis assez sûr que Visual Studio fera cela. P>
Puis-je suggérer mon propre profileur open source Raven :: Set :: Crunwatch? Il est conçu pour exactement ce problème et fonctionne sur Windows à l'aide de Visual Studio 2008 Standard Edition. Vous n'avez donc pas besoin de payer la version qui a le profileur incluse.
J'ai pris votre code, le réarrangé légèrement de sorte qu'il compile sans déclarations avant et ajout d'appels nécessaires sur Crunwatch P>
raven::set::cRunWatch code timing profile Scope Calls Mean (secs) Total highly_optimised_subroutine 1008 0.002921 2.944146 badly_written_function 1 2.926662 2.926662 well_written_function 1 0.026239 0.026239
Cela nécessite de booster. Presque tous les programmes que j'écris utilisent Boost d'une manière ou d'une autre. Boost est libre et incroyablement utile.
@Joseph Quinsey Alors je m'attends à ce que vous manquiez également le comptoir de performance haute résolution, qui est le cœur battant de Crunwatch.
En règle générale, c'est quelque chose que vous souhaitez observer le temps total de la fonction par opposition à soi-même, pour vous assurer que vous examinez le temps qui inclut le temps des fonctions appelées. P>
Dans Vtutune, je vous recommanderais d'utiliser un onglet Top-Down pour cela. Ou encore mieux et si vous utilisez une mise à jour la plus récente, essayez la nouvelle vue de l'appelant expérimental-callee. Vous pouvez obtenir des détails à ce sujet ici - http://software.intel.com/fr -Us / Forums / Topic / 376210 . Il reçoit une liste plate de fonctions avec leur temps total afin que vous puissiez voir quels sont les principaux sous-arbres de consommation de temps dans votre programme. P>
C'est généralement appelé "profil de callgraph", et je suis assez sûr que Visual Studio fera cela. Bien que ma mémoire soit un peu floue car cela fait plusieurs années que j'ai effectué un développement de Windows.
Je suis à peu près sûr que Vtuune permet une ventilation où vous pouvez voir et trier par le temps total consommé, y compris les fonctions qu'elle appelle. Toutefois, pour que cela soit utile, vous avez besoin d'une intuuion raisonnable de la quantité de temps nécessaire dans laquelle la fonction.
@Torak: Vous souvenez-vous du nom de la fonctionnalité? - J'ai une compréhension approximative de la durée de la durée de certaines fonctions, alors je suis sûr qu'une telle panne serait très utile.
Le monde serait un meilleur endroit si Valgrind travaille dans Windows.
@Mick: Désolé, je ne peux pas me rappeler du haut de ma tête. Je vais essayer de vous souvenir de vous reposer sur VTune et de vérifier quand je rentre à la maison.
@Mike Seymour: Oui, il ressemble à "Profil de graphique d'appels" est le concept que je cherchais. Je viens de le trouver dans les fichiers d'aide de Vtuune et je joue avec elle en ce moment. Vous devriez mettre votre suggestion comme une réponse plutôt qu'un commentaire et je vais le marquer comme correct afin que vous puissiez obtenir les points de réputation.