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 :

Code conditionnel : if else ou for_each ?


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Ingenieur
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingenieur

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut Code conditionnel : if else ou for_each ?
    Bonjour,

    A propos des performances j ai une question qui me chagrine. Voici un exemple simple:
    si dans une methode appelee frequemment j ai par exemple:
    • n traitements independants

    • chaque traitement sera effectue en fonction de son activation et celle ci est connue au depart

    • Chaque traitement prend les meme donnees en entree


    Vaut - il mieux un code comme le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void method(...)
    {
      if(traitement_1_actif)
      {
        traitement_1(...);
      }
      .......
      if(traitement_n_actif)
      {
        traitement_n(...);
      }
    }
    mais j ai peur que tous ces test a effectuer ne ralentissent le code

    ou alors l autre alternative que je vois est la suivante:
    tous les traitements implementent une interface commune etant donne qu ils utilisent les memes entree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    constructeur(....)
    {
      // m_traitements est un vecteur de traitement membre de la classe
      if(traitement_1_actif)
      {
        m_traitements.push_back(traitement_1);
      }
      .......
      if(traitement_n_actif)
      {
        m_traitements.push_back(traitement_n);
      }
    }
     
    void method(....)
    {
      // ApplyTraitement est un objet fonction permettant de faire passer les donnees aux traitements du vector
      for_each(m_traitements.begin(),m_traitements.end(),applyTraitement(...));
    }
    J ai tendance a trouver la deuxieme solution plus elegante mais ce que je cherche avant tout c est l efficacite en terme de temps d execution...
    selon vous y en a t il une meilleure que l autre ? ou voyez vous un autre moyen plus efficace ?

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Si tu cherches la performance, utilise déjà la première version, déroule les boucles simples, ne fait pas trop confiance à la STL (il faut que tu comprennes bien ce qui se passe derrière), limite les appels de fonctions non inlines ...

    mais j ai peur que tous ces test a effectuer ne ralentissent le code
    Absolument pas, le coût d'un if est vraiment très faible par rapport à l'insertion dans un vector ou une liste.

  3. #3
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Et un tableau de pointeurs sur fonctions de traitement ?

  4. #4
    Membre confirmé
    Profil pro
    Ingenieur
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingenieur

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Citation Envoyé par PRomu@ld
    Absolument pas, le coût d'un if est vraiment très faible par rapport à l'insertion dans un vector ou une liste.
    Oui mais l insertion dans le cas de la deuxieme solution se fait une seule fois: au moment de la construction de l objet alors que ma method sera appelée plusieurs millions de fois.

    Dans ce cas se ne serait pas plutot le cout du for_each avec celui des if qu il faudrait comparer ?

    Citation Envoyé par goodpz
    Et un tableau de pointeurs sur fonctions de traitement ?
    euh dans ce cas je retombe un peu sur le meme probleme, est-il moins couteux de faire une boucle qui parcourt le tableau avec les tests que ça implique ou enchainer les if


    Citation Envoyé par PRomu@ld
    limite les appels de fonctions non inlines
    Je compile en -O3 avec g++, il me semble que dans ce mode la il inline tout mais peut etre serait il plus sur de la declarer inline de toute façon

  5. #5
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    J'ai du mal à voir comment il aurait réussi à inliner des pointeurs sur fonction, dont la valeur dans ton cas est déterminée à l'exécution.

  6. #6
    Membre confirmé
    Profil pro
    Ingenieur
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingenieur

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    oui en effet

  7. #7
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Citation Envoyé par quicky2000
    euh dans ce cas je retombe un peu sur le meme probleme, est-il moins couteux de faire une boucle qui parcourt le tableau avec les tests que ça implique ou enchainer les if
    Citation Envoyé par HanLee
    J'ai du mal à voir comment il aurait réussi à inliner des pointeurs sur fonction, dont la valeur dans ton cas est déterminée à l'exécution.
    Est on sûr que le compilo va pouvoir inliner les fonctions de traitement ?
    Comme les N fonctions sont connues au départ du programme, construite un tableau de N pointers sur fonction puis le parcourir plus tard dans le programme n'est peut être pas une si mauvaise idée que ça.

    Si on est sûr que les fonctions sont inlinées dans le cas des séries de if, alors ma suggestion est bonne à jeter en effet

  8. #8
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Est on sûr que le compilo va pouvoir inliner les fonctions de traitement ?
    Non, on est sur de rien, si le compilateur juge la fonction trop compliquée, il ne va pas la mettre inline.

    Oui mais l insertion dans le cas de la deuxieme solution se fait une seule fois: au moment de la construction de l objet alors que ma method sera appelée plusieurs millions de fois.
    Pardonne moi, ce n'était pas ce que j'avais compris au départ. La solution d'un tableau de pointeur de fonction me parait relativement bonne alors.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Fais des mesures et tu verras bien.

    Perso je partirai plutôt sur le for_each pour des raisons de maintenabilité dans le cas où il devrait y avoir beaucoup de traitements et que ceux-ci pourraient évoluer au fil de la maintenance du projet. Maintenant, s'il n'y a que deux tests ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Optimisation d'un code contenant plusieurs else if
    Par rihab92 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2015, 14h26
  2. Peut-on simplifier ce code conditionnel
    Par alheuredudejeuner dans le forum Android
    Réponses: 3
    Dernier message: 14/04/2013, 20h49
  3. Compatibilité PC/Mac code conditionnel ?
    Par Antipod dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2010, 00h49
  4. Code conditionnel
    Par Micklabrute dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 14/02/2009, 23h35
  5. Les tests conditionnels - If - Else if - Else
    Par stomerfull dans le forum Langage
    Réponses: 6
    Dernier message: 08/05/2008, 12h12

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