IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[conception]Comment mettre un profiler dans son code?


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut [conception]Comment mettre un profiler dans son code?
    Bonjour,

    Je suis en train d'essayer de profiler mon code. N'arrivant pas a utiliser les outils Visual Studio pour le faire, je me suis fait une petite classe simple qui me permettra de le faire.
    Code Profiler.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Profiler{
      private :
         std::Queue<ProfilerRow> Data;
      public:
         Profiler(void);
         ~Profiler(void);
         Profiler(bool const & bNeed2Profile);
         In(std::stName);
         Out(std::stName);
         SumUp(void);
    };
     
    // methode 2!
    Profiler myProfiler;

    Le probleme n'est pas dans le code du profiler mais dans comment le mettre dans mon code.
    je pensais mettre un objet Profiler dans la classe a profiler, mais je ne peux pas profiler dans les methodes const. du coup ce n'est pas là bonne methode.

    Je pensais faire une variable globale dans le Profiler.h mais j'ai peur que ce soit un peu illisible pour le reste.

    Donc en fait je ne sais pas comment mettre mon profiler en place dans mon code. =(

    Est ce que quelqu'un a des idées, des conseils ou a deja fait ça? Je ne vois pas la solution la plus propre...

    E.G

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut !

    Il y a plusieurs méthodes pour s'y prendre.

    Tout d'abord, tu peux peut-être utiliser un profiler non-intrusif. gprof ou callgrind font bien l'affaire sur Linux (si la pile logicielle est simple en Java/JNI/C++ c'est chiant ). Sur Windows (c'est ton cas) je ne connais pas bien mais il y en a aussi. Les meilleurs sont payants, et chers... un autre développeur devrait pouvoir te conseiller sur ce point. C'est la solution idéale car ça t'évites de devoir instrumenter le code à la main.

    Sinon, il peut être intéressant d'utiliser un profiler écrit soi-même. C'est pas cher et si on a pas des besoins de mesures pas trop poussés et très localisés, ça peut amplement suffire ! Attention ça peut devenir limite si tu es dans le cas ou tu recherches des points d'étranglements sans avoir aucune idée d'où ils sont.

    Pour l'intégrer dans ton code: ma méthode préférée est à base de macro. Tu peux faire un truc dans ce goût là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef PROFILING
    #   define PROFILER_DECLARE() mutable Profiler m_local_profiler
    #   define PROFILER_FUNC_ENTER(A) m_local_profiler.In(A)
    #   define PROFILER_FUNC_OUT(A) m_local_profiler.Out(A)
    #else
    #   define PROFILER_DECLARE(...)
    #   define PROFILER_FUNC_ENTER(...)
    #   define PROFILER_FUNC_OUT(...)
    #endif
    Comme ça tu peux produire du code de production non instrumenté. Le mot clé mutable te permet de l'utiliser dans des fonctions const. Attention: si tes méthodes sont appelées par plusieurs threads, les In et Out tout seuls, n'auront plus de sens et il faudra être plus malin en identifiant chaque appel.

    Enfin, tu peux jeter un oeil du côté de la programmation par aspect mais franchement je ne te le conseille pas, c'est plutôt exotique comme solution.
    Find me on github

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par EvaristeGaloisBis Voir le message
    Bonjour,

    Je suis en train d'essayer de profiler mon code. N'arrivant pas a utiliser les outils Visual Studio pour le faire, je me suis fait une petite classe simple qui me permettra de le faire.
    Le probleme n'est pas dans le code du profiler mais dans comment le mettre dans mon code.
    je pensais mettre un objet Profiler dans la classe a profiler, mais je ne peux pas profiler dans les methodes const. du coup ce n'est pas là bonne methode.
    Visual Studio, en particulier si tu à une version payante (aucun outil de profiling fourni avec la version express ?) est assez complet dans ce domaine quand même.

    Sinon tu peux déclarer ton profileur comme "mutable".

  4. #4
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    merci pour vos réponses.
    Effectivement mutable ne m'était pas venu a l'idée.

    J'utilise la version 2008 de Visual studio, et j'ai bien des outils seulement, je n'arrive pas a les utiliser. Je pensais utiliser SPY++ mais il ne semble pas etre fait pour profiler...

    En tout cas l'idée du passage par macro est tout a fait interessant et me plait beaucoup =)

    E.G

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il y a quelques mois, j'ai proposé cette solution pour être en mesure de mesurer le temps d'exécution de différentes fonctions.

    Elle est écrite en C++11, ce qui implique qu'il faille un disposer d'un compilateur *relativement* récent (support des variadic templates, de <chrono> et de std::function requit) et présente l'avantage de ne pas être excessivement intrusive parce qu'elle s'utilise sur n'importe quelle fonction, mais l'inconvénient de ne te permettre la mesure que des fonctions que tu lui indiques explicitement.

    L'idéal est donc, sans doute, de l'utiliser dans un projet séparé de ton projet original

    Evidemment, elle est encore perfectible en bien des points, mais elle devrait pouvoir te donner une base sympa pour commencer si tu ne veux absolument pas recourir aux outils externes existants (ou s'il t'es impossible d'en utiliser pour une raison ou une autre)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    salut koala01,

    Merci pour ton code et ta réponse. Je n'ai pas trop la tete a me plonger dans tout le code de ta classe mais d'ici une bonne semaine ce sera fait! En le lisant en diagonale, et si j'ai bien compris ta solution consiste a passer par une classe qui lance ta fonction afin d'etre sur de l'encapsuler...Non? =(

    Juste une question annexe.
    De mon coté, le code ralentit incroyablement les appels et pis que tout il fait sauter la mémoire. Pour info ma pile fait quasi 10 millions de lignes. Sachant que ma ProfilerRow est une petite structure composée d'un integer, d'un booléen, d'un time_t.

    Est ce normal? Ai je trop exagéré? ou m'y suis je mal pris?

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par EvaristeGaloisBis Voir le message
    De mon coté, le code ralentit incroyablement les appels et pis que tout il fait sauter la mémoire. Pour info ma pile fait quasi 10 millions de lignes. Sachant que ma ProfilerRow est une petite structure composée d'un integer, d'un booléen, d'un time_t.

    Est ce normal? Ai je trop exagéré? ou m'y suis je mal pris?
    Boarf tu t'es vautré dans un code récursif qui ne tombe sur aucune condition terminale et t'as fait sauter la stack, un classique Si ça le fait qu'en activant le profiling, l'erreur peut être dans l'implémentation de celui-ci.

    Si c'est la RAM que tu exploses, le problème provient peut être plus de mémoire non libérée.
    Find me on github

  8. #8
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    En fait ça saute en RAM lorsque je profile pas lorsque je depile les données pour avoir mes informations.
    Je refais un test et mets mon code source dans la journée (car pas sous la main actuellement).

Discussions similaires

  1. Comment mettre ma classe dans son fichier
    Par herzak dans le forum Android
    Réponses: 0
    Dernier message: 14/11/2013, 18h48
  2. Comment jouer le profiler dans le code ?
    Par berceker united dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 17
    Dernier message: 19/01/2008, 19h21
  3. [FLASH MX] Mettre en gras dans ce code
    Par celina5880 dans le forum Flash
    Réponses: 6
    Dernier message: 15/01/2006, 15h16
  4. COMMENT METTRE 2 CHAMPS DANS LE MEME DBLOOKUPCOMBOBOX
    Par ledevelopeur dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/07/2004, 15h15
  5. Comment gérer plusieurs icones dans son exécutable ?
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2003, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo