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 :

le compilateur optimise-t-il?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut le compilateur optimise-t-il?
    Bonjour.

    J'ai souvent entendu que les compilateurs actuels etaient capable d'optimiser bien mieux que nous et qu'il fallait leur laisser cette tâche. Cela m'amène a la question suivante

    dans une fonction "principale", j'appelle a la suite une série de fonction. Elles retournent toutes un booléen qui vaut true si l'execution a reussi, false sinon.
    Dès qu'une des fonction retourne false, j'arrète l'execution de la fonction principale et je retourne false.

    J'ai plusieures façon d'écrire ça:

    1:
    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
    21
    22
     
     
    bool fonction_principale()
    {
     bool valeurRetour=true;
     
     valeurRetour = fonction1();
     if(valeurRetour == true)
      {
        valeurRetour = fonction2();
        if(valeurRetour == true)
        {
         valeurRetour = fonction3();
         if(valeurRetour == true)
           {
              /* etc etc*/
           }
         }
        }
      }
    return valeurRetour
    }
    2:
    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
    21
     
    bool fonction_principale()
    {
     bool valeurRetour=true;
     
     valeurRetour=fonction1();
     if(valeurRetour=false) return false;
     
     if(valeurRetour=true) valeurRetour=fonction2();
     if(valeurRetour=false) return false;
     
     if(valeurRetour=true) valeurRetour=fonction3();
     if(valeurRetour=false) return false;
     
     /* etc etc*/
     
     
     if(valeurRetour=true) valeurRetour=fonctionN();
     
    return valeurRetour;
    }
    je trouve la deuxième méthode beaucoup plus lisible. Mais le problème c'est que si la fonction1 retourne false, il y aura encore (n-1) tests effectués pour rien. Ma question c'est : est-ce que le compilateur se rend compte que j'effectue plein de fois le meme test a la suite, et est-ce qu'il générera le même code machine que dans le premiers cas?
    (ou est-ce qu'il ne faut pas trop pousser quand même^^)

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Tu peux aussi faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if(
          function1()
          &&
          function2()
          &&
          ...
          &&
          functionN()
       ) {
       return true;
    }
    else {
       return false;
    }
    Il testera tes fonctions dans l'ordre de l'appel dans ta condition if

  3. #3
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Sinon, pour répondre à ta question première, l'optimisation du compilateur dépend de beaucoup de choses :

    1) du compilateur : chaque compilateur a sa propre méthode d'optimisation
    2) de la version du compilateur en question
    3) de la demande explicite lors de la compilation, par exemple pour gcc tu peux préciser des paramètres commes "-O2" ou même "-O3" qui forcent certaines optimisations

    Je pense qu'en règle générale, la compilation du compilateur est "suffisament" optimisée. Il incombe au programmeur d'avoir un code performant, et il ne faut pas trop compter sur les options d'optimisations pour pallier à une faute de design qui entrainerait un gouffre de performances.

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Merci bien pour ta réponse, elle me convient parfaitement.

    Pour l'exemple que tu m'as donné avec les AND, tu veux dire que dès qu'une des fonctions retourne false. il retourne false sans appeler les fonctions suivantes?

    Si c'est le cas c'est vraiment bon à savoir.

  5. #5
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Oui c'est exactement ce qu'il va faire : ça permet par exemple dans un même if de tester l'existence d'un fichier avant de tester sa longueur; sans provoquer une erreur de lecture lors du test de la longueur si le fichier n'existe pas.

    Une règle d'optimisation est d'ailleurs de placer en tête les conditions les plus probables dans un if qui contient plusieurs conditions, ainsi on a plus de chance de sortir "plus vite" de la condition.

  6. #6
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Ok, je pense m'en servir souvent.
    MERCI

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tes retours à false correspondent à des erreurs, alors tu peux te tourner vers les exceptions. Du coup ton code sera beaucoup plus simple, et plus efficace.

    A part ça, effectivement ton code est une version beaucoup plus compliquée (mais équivalente) de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool fonction_principale()
    {
        return fonction1() && fonction2() && ... && fonctionX();
    }

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Pour en rajouter une louche, on ne teste jamais si une variable booléenne est vrai ou fausse.
    Par définition un booléen est vrai ou faut, tester sa valeur via une comparaison avec '=='
    est inutile et redondant.
    En d'autres termes on n'écrit pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (monBool == true) { ... }
    Mais :

  9. #9
    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: le compilateur optimise-t-il?
    Il y a aussi ces 2 methodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool fonction_principale()
    {
      if(fonction1())
        if(fonction2())
          if(fonction3())
            /* etc etc*/
              return fonctionN();
      return false;
    }
    ou son pendant mais que je trouve moins elegant mais qui permet de ne pas partir trop loin en indentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    bool fonction_principale()
    {
      if(!fonction1())
        return false;
      if(!fonction2())
        return false;
      if(!fonction3())
        return false;
      /* etc etc*/
      return fonctionN();
    }

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Une autre chose qu'il m'est arrivé de faire, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool bOK=true;
    bOK = bOK && fonction1();
    bOK = bOK && fonction2();
    bOK = bOK && fonction3();
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    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
    C'est quoi ce désir de ce compliquer la vie ?

    La solution donnée par Loulou est simple (en supposons que l'on parle couramment le booléen de la rue (ce n'est pas comme si il s'agissait d'une table de carnot (ortho?) réduite) ; si ce n'est pas le cas, il est temps de s'y mettre) et efficace.

    A la limite la solution donnée par médinoc (avec &&=) pour si on veut débugguer. Mais bon.
    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...

  12. #12
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Il faut penser à la maintenance : tout mettre dans le return, ça pose un problème, pour le jour où il faut faire autre chose qu'un return Avec un if, on est libre de faire ce qu'on veut, un return, un appel de méthode, ou autre !

    ( pour défendre un peu ma cause )

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Karnaugh

  14. #14
    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
    Citation Envoyé par Miles
    Karnaugh
    Arf que c'est vieux.

    Pour les exécutions supplémentaires ... ben si il devait vraiment y avoir des trucs à faire, avec toutes les possibilités (8 ici), il y aura pas mal de changements dans le code. Autant faire simple en attendant.
    (et puis avec un bon éditeur de code customisé, et en quelques appuis de touches, le test est déplacé et réindenté dans la condition d'un "if" 8))
    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...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction vide: compilateur optimise ou pas
    Par kacedda dans le forum C++
    Réponses: 14
    Dernier message: 21/01/2008, 16h15
  2. Réponses: 2
    Dernier message: 23/08/2007, 15h46
  3. Optimisation du compilateur .net
    Par jeromechezgdf dans le forum Général Dotnet
    Réponses: 11
    Dernier message: 09/07/2007, 16h30
  4. [Compilateur] Optimisation des conditions
    Par Pedro dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 13h49
  5. Débogage corrompu par les optimisations du compilateur
    Par petitcoucou31 dans le forum EDI
    Réponses: 6
    Dernier message: 17/12/2003, 00h30

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