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

Affichage des résultats du sondage: Quelle structure de code préférez-vous?

Votants
16. Vous ne pouvez pas participer à ce sondage.
  • Pas de préférence

    1 6,25%
  • if(condition)else...

    5 31,25%
  • if(condition)return;...

    10 62,50%
C++ Discussion :

if(condition)return;... ou if(condition)else...


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Par défaut if(condition)return;... ou if(condition)else...
    Salut
    Je cherche à savoir lequel de ces deux codes est le plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void function(int i)
    {
     if(i==0){
     cout<<"impossible";
     return;
     }
     //suite de la fonction
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void function(int i)
    {
     if(i==0){
     cout<<"impossible";
     }
    else
     {
     //suite de la fonction
     }
    }
    Merci de bien vouloir m'aider

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Par défaut Re: if(condition)return;... ou if(condition)else...
    Citation Envoyé par tlemcenvisit
    Salut
    Je cherche à savoir lequel de ces deux codes est le plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void function(int i)
    {
     if(i==0){
     cout<<"impossible";
     return;
     }
     //suite de la fonction
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void function(int i)
    {
     if(i==0){
     cout<<"impossible";
     }
    else
     {
     //suite de la fonction
     }
    }
    Merci de bien vouloir m'aider
    Personellement je trouve la deuxieme solution beaucoup plus propre. Et, mais je peux me tromper, je ne pense pas qu'il y ait une difference de performance.

  3. #3
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bonjour,

    D'un point de vue lisibilité les deux codes se valent.

    Dans le premier cependant, il y a un branchement vers return en cas de nullité de i.

    Deuxième code:
    Il y a evaluation d'une condition puis saut court si la condition est fausse vers le code de la clause else. A la fin de la clause else, il y a un nouveau saut court vers la suite du code ou la sortie de la fonction.

    Premier code:
    Il y a toujours évaluation de la condition, saut court vers la suite ou fion de fonction.

    Donc, le premier code prend moins de cycle processeur pour s'éxecuter. De plus, pour être complet, il est plus compact que le deuxième code, le code C++ traduit en upcode (code généré en binaire) est moins volumineux et se charge plus rapidement dans le pipeline du processeur.

    Attention tout de même, ces considérations sont de l'ordre de la dizaine de nanosecondes, pas plus.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut
    Bonjour,


    A ta place, je partirai du cas le plus fréquent, c'est à dire quand i n'est pas nul.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void function(int i) {
     
           if (i!=0) {
                /* Ton code */  ; }
           else      { 
                cout <<" impossible" << endl; };
    }
     
    Cela évite un débranchement dans la plupart des cas.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans le cas où il y a un seul test, les deux codes me semblent assez lisibles.

    Dans le cas où il y en a plusieurs, le deuxième peut devenir préférable.

    Si le deuxième commence à devenir préférable, un troisième pointe le bout de son nez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void function(int i)
    {
      if(i==0){
      cout<<"impossible";
      }
      else {
         faitLeBoulot();
      }
    }
    En terme de performances :
    - Est-ce que ton profiler t'as montré qu'il y avait un goulot d'étranglement dans ta fonction ?
    - Si oui, il doit te permettre de mesurer les alternatives et de choisir la plus rapide
    - Si non, à quoi ça sert de micro-optimiser ?
    - De toute façon, je serais très surpris qu'il y ait la moindre différence dans ces cas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Il faut demander au compilateur de traduire les deux codes en assembleur pour voir la différence, qui se joue à un jump de plus dans le deuxième cas.

    D'un autre côté, c'est vrai que suivant l'agencement des modules, le ret du return peut être plus long que le jump du deuxième cas.

    Pour les problèmes de performances, l'assembleur est ton ami, on ne peut pas toujours profiler du code (Embarqué notamment).

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je me pose aussi la question de mettre ou non le else. Ne pas le mettre économise un bloc d'accoaldes, donc un retrait supplémentaire du code. Mais les puristes considèrent que le flot d'exécution doit toujours se terminer à la fin du code de la fonction et qu'un return en cours de route est un sacrilège...

  8. #8
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    moi on m'a appris a faire la deuxième solution, le return arrettant net si la condition est respectée, il ne cherchera pas à aller à la fin du else pour vérifier si il reste du code à executer, un tout petit(tout petit tout petit) gain de temps

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Par défaut
    En général, les programmeurs utilisent la deuxième méthode, je voulais savoir les inconvénients de la 1ere
    C'est surtout ça l'objectif de la question

  10. #10
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Alors tu as mal formuler ta question, car les inconvénients de la première méthode concerne d'autres domaines que la vitesse du code.

    En preuve de programme, en analyse avant-arrière aussi,il peut devenir difficile de prédire les valeurs de sortie d'un fonction truffée de (if return) même en fixant les valeurs des arguments, surtout quand les tests font appels à des variables globales calculées dans d'autre modules.

    De plus, dans certaines normes de programmation comme SSIL 4, il est interdit d'utiliser cette forme de programmation.

    Citation Envoyé par tlemcenvisit
    En général, les programmeurs utilisent la deuxième méthode, je voulais savoir les inconvénients de la 1ere
    C'est surtout ça l'objectif de la question

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut
    En algorithmique, on se débrouille toujours pour mettre le cas général (comprendre le cas où tout marche sans erreur) en place prioritaire, d'où ma proposition de traiter le cas (i!=0).

    Tu peux même écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (i !=0) function(i);
    dans le corps de ton programme appelant.
    ( Dans ton cas, si i est nul on n'exécute pas void function(int i).)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Par défaut
    Les normes de programmation !
    C'est un concept que je ne connais pas
    Et qu'est ce qu'il y a comme normes de programmation aussi?

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    A mon avis, au niveau performance, ça ne change strictement rien, le compilateur optimisant les 2 pareil.

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Mais les puristes considèrent que le flot d'exécution doit toujours se terminer à la fin du code de la fonction et qu'un return en cours de route est un sacrilège...
    Les puristes initiés savent qu'il est illusoire d'avoir un programme aisé à maintenir avec un flot d'exécution qui va gentillement attendre le return. Surtout en C++, grâce aux exceptions, on a plein de déroutements potentiels qui surgissent.
    Forcer le SESE au mileu d'exception est je trouve un défi pour les amateurs de code spaghetti.

    La règle du SESE (single entry single exit) a deux intérêts en ce qui me concerne :
    - quand une fonction est tellement longue qu'elle en devient trop difficile à maintenir/comprendre sans SESE
    - quand on a des ressources gérées à la main.

    Dans les règles que je considère vraiment importantes, il y a :
    - fonctions simples, (très) courtes et limitées à une tâche simple (rejoint le principe des raffinements successifs)

    Ensuite, moins connu et pourtant hyper utilie :
    - Gestion déterministe des ressources (via RAII)

    Autant dire que le SESE ne sert plus à rien sauf à me faire me poser des questions pour savoir où intervient le booleen qui autorise à continuer la boucle.


    Une fonction find de 4 lignes (5 avec la signature) avec un return en plein milieu de la boucle de recherche est suffisament idiomatique pour ne pas avoir à s'encombrer du SESE.

    Une fonction de 40 lignes qui fait son find à elle, puis une notification (en bouclant sur tous les élements liés à celui trouvé), et enfin un retrait de l'élément trouvé (boucle explicite de nouveau), c'est n'importe quoi.
    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...

  15. #15
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Le SESE est utile dans certains domaines, comme les automates embarqués et sécurisés. Ou il peut tout simplement s'agir de règles de codage d'une SSII.

    Cependant, il est vrai, je ne comprends toutjours pas en quoi coder en SESE ou non est plus sécurisé. En tant que programmeur averti, je ne vois pas le problème.

    Par contre dans l'analyse Avant/Arrière qui sert parfois pour determiner les valeurs de test de modules, une fonction non SESE devient vite pénible à analyser.

    Chaque domaine informatique a ses règles et besoins de programmation.

    Comme je l'ai indiqué, la problématique de la performance comme des incovénients des deux types de codes est surtout de l'ordre de l'information.

    Effectivement quelque soit le choix du programmeur, s'il enclenche les optimisations du compilateur, celui-ci tranformera le code pour obtenir le meilleur code assembleur possible et le plus performant.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Par défaut
    Je n'ai pas de concepts si avancés en programmation
    Merci de bien vouloir me dire ce que je dois utiliser de préférence, avec une simple explication si c'est possible

  17. #17
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Tu sais les concepts avancés viennent en se documentant

    La conclusion est que tu peux utiliser les deux formes. Tu as le choix, à ce niveau l'une ou l'aure est plus une question de style voir de préférence.

    Perso, je préfère plusieurs return au lieu de trop d'imbrication de if ... else if ...

  18. #18
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut
    "un seul return par fonction"
    est une des règle de codage que j'ai toujours vu dans tous les projets auxquels j'ai participé.
    Ca permet une meilleure lisibilité du code. Au début j'étais sceptique, mais c'est vrai que quand tu as du code à lire/comprendre/débugger et que ce n'est pas le tien, ce genre de règle prend toute leur importance. C'est tout simplement plus lisible, plus facile à comprendre, le gain de performance, s'il y en a, étant dans la plupart des cas négligeable. Je précise bien dans la plupart des cas, pour ne pas me faire incendier par les gourous.
    D'un point de vue Génie Logiciel, cette règle n'est pas idiote, elle vas dans le sens de l'uniformisation du code source, ce qui procure une meilleure maintenabilité.

  19. #19
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Oui et non, je lis régulièrement du code qui enfreind la règle SESE sans que ça ne me pose le moindre souci de compréhension (non pas que le code soit bien écris, loin de là).

    C'est comme tout, chacun a son domaine de prédilection. C'est surtout en preuve de programme que ça devient critique à mon avis (puisque le topic est un sodage maintenant ).

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Avant de discuter des bienfaits du SESE, j'aimerais que l'on me réécrive le bout de code suivant de telle manière qu'il soit SESE. On pourra alors comparer la lisibilité sur un exemple concrêt (attention, cet exemple est subversif ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    map <string, int> frequences(istream &f)
    {
      string mot;
      map<string, int> freq;
      while (f >> mot)
      {
        freq[mot]++;
      }
      return freq;
    }
    Là où je suis d'accord, c'est qu'il faut éviter qu'une fonction contienne des structures de contrôle trop complexes, afin d'éviter le code spaguetti. Mais ça n'a rien à voir avec SESE.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Condition IF avec sous condition
    Par voyageurdumonde dans le forum Langage
    Réponses: 11
    Dernier message: 25/03/2011, 18h55
  2. Réponses: 6
    Dernier message: 24/01/2010, 21h34
  3. Réponses: 23
    Dernier message: 26/05/2008, 06h18
  4. Réponses: 3
    Dernier message: 11/06/2006, 12h09
  5. Probleme Condition IF et ELSE
    Par arround dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2005, 01h21

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