8
votes

Aide au profilage requis

J'ai un problème de profilage - imaginez que j'ai le code suivant ... xxx

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.

Y a-t-il une caractéristique de Vtutue qui m'aidera à trouver le problème?

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 ?


6 commentaires

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.


4 Réponses :


1
votes

Rouler votre propre simple em> strong> profileur n'est pas si difficile. Insérer dans Main ():

void (profileCpuUsage)(const char *description)...
  • Vous pouvez le temps tout fragment de code em>, pas seulement des procédures. LI>
  • Il est rapide à ajouter et à supprimer, car vous faites une recherche binaire pour trouver et / ou supprimer des points chauds de code. LI>
  • Il ne se concentre que sur le code qui vous intéresse. LI>
  • portable! li>
  • baiser li> ul>

    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> xxx pré>

    pour unix droit il y a le commun: p> xxx pré> RealLapsedTime () donne du temps d'horloge murale, pas du temps de traitement, ce qui est généralement ce que je veux. 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> xxx pré>

    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> xxx pré>

    Si cela est terminé, vous devez bien entendu ajouter des parenthèses à la définition pour désactiver La macro désactivée: p> xxx pré> p>


0 commentaires

1
votes

C'est généralement appelé "profil de callgraph", et je suis assez sûr que Visual Studio fera cela.


0 commentaires

1
votes

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


2 commentaires

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.



0
votes

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.

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.


0 commentaires