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 :

Difference entre un "if" en chaine et un "switch"


Sujet :

C

  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut Difference entre un "if" en chaine et un "switch"
    Bonjour,

    Bien que je ne sois pas un débutant, je me suis demandé les differences entre une suite de if avec un test d'entier et un switch, y a t il une difference de vitesse d'execution ?

    Merci du renseignement.
    Florent

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 142
    Par défaut
    Salut,

    Un switch est l'équivalent d'une succession de bloc if/else if/else.
    Au niveau de la rapidité, le switch va accéder une seul fois a la cellule mémoire afin de la comparer aux "case".
    Alors qu'avec une succession de bloc if/else if/else on accède plusieurs fois a l'élément à comparer.

    On gagne ainsi un temps d'exécution qui peut être négliger selon le projet

    Cela permet aussi de rendre le code plus lisible et compréhensible.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par FunK92 Voir le message
    Au niveau de la rapidité, le switch va accéder une seul fois a la cellule mémoire afin de la comparer aux "case".
    Alors qu'avec une succession de bloc if/else if/else on accède plusieurs fois a l'élément à comparer.
    C'est difficile d'être aussi affirmatif à priori.
    Rien ne garantit que l'accès à la valeur à tester ne soit effectuer qu'une seule fois dans le cas d'un switch.
    De même, il est tout à fait envisageable qu'un compilateur optimise les tests et qu'au final le code généré soit le même dans les deux cas.

    Sans mesure précise ni analyse du code assembleur généré, il est difficile, si ce n'est impossible, de prédire quel code sera le plus rapide (et tant tout les cas, la différence sera probable minime voire insignifiante).

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    En fait, l'équivalent ne serait pas véritablement une succession de blocs if/else mais plutôt une succession de if/goto (bien que les if/else soient également traduits sous forme de goto en assembleur -instructions JMP et variantes en asm), qui est 'structurée' de manière différente.

    Par exemple, l'équivalent de ce code (sans aucun "break;" après chaque "case") :

    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
        int a=0;
     
        switch(a)
        {
            case 0:
            printf("Zero\n");
    /* break; */
     
            case 1:
            printf("Un\n");
    /* break; */
     
            default:
            printf("Defaut\n");
    /* break; */
        }
    /* suite du programme */
    est :

    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
        int a=0;
     
        if (a==0) goto case_0;
        if (a==1) goto case_1;
        goto defaut;
    case_0:
        printf("Zero\n");
    /* Un "break;" ici dans le "case" correspondant équivaut à un : goto fin; */
    case_1:
        printf("Un\n");
    /* Un "break;" ici dans le "case" correspondant équivaut à un : goto fin; */
    defaut:
        printf("Defaut\n");
    /* Un "break;" ici dans le "case" correspondant équivaut à un : goto fin; */
    fin:
     
    /* suite du programme */
    ce qui serait parfois très compliqué à écrire sous forme de blocs if/else car si on omet le "break;" à la fin de chaque "case", le code exécuté commence au "case" correspondant à la valeur testée et se poursuit ensuite même dans les "case" suivants non concernés.

    Dans mon exemple, si la variable "a" vaut 0, les instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("Zero\n");
    printf("Un\n");
    printf("Defaut\n");
    sont toutes les 3 exécutées.

    Si "a" vaut 1, seules les instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("Un\n");
    printf("Defaut\n");
    sont exécutées.

    Par contre, si on met un "break;" à la fin de chaque "case", seule les ou l'instruction correspondante au "case" concerné sont/est exécutée(s). On peut dans ce cas effectivement écrire le code équivalent sous forme de blocs if/else if/else sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        int a=0;
     
        if (a==0)
        {
            printf("Zero\n");
        }
        else if (a==1)
        {
            printf("Un\n");
        }
        else
        {
            printf("Defaut\n");
        }
    Pour écrire une équivalence du code d'un "switch" ne comportant aucun "break;" à l'intérieur, avec des blocs if/else, il faudrait coder quelque chose du style :

    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
        if (a==0)
        {
            printf("Zero\n");
        }
        if (a==0 || a==1)
        {
            printf("Un\n");
        }
        if (a==0 || a==1 || a==2)
        {
            printf("Deux\n");
        }
        if (a==0 || a==1 || a==2 || a==3)
        {
            printf("Trois\n");
        }
    /* etc */
    ce qui reviendrait à ajouter un test 'OU' à chaque fois, au fur et à mesure. Ca compliquerait le code donc.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une discussion a évoluée vers la même question côté C++. Cf ici.

Discussions similaires

  1. Difference entre [Simple quote] & [Double quote]
    Par Invité dans le forum SQL
    Réponses: 3
    Dernier message: 24/07/2013, 12h24
  2. Réponses: 10
    Dernier message: 31/05/2007, 15h10
  3. [PL/SQL] Chaine de caractères avec une quote
    Par Titouf dans le forum Oracle
    Réponses: 2
    Dernier message: 15/05/2006, 14h36
  4. Réponses: 7
    Dernier message: 03/02/2006, 13h50

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