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
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
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.
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).
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") :
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; switch(a) { case 0: printf("Zero\n"); /* break; */ case 1: printf("Un\n"); /* break; */ default: printf("Defaut\n"); /* break; */ } /* 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.
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 */
Dans mon exemple, si la variable "a" vaut 0, les instructions
sont toutes les 3 exécutées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 printf("Zero\n"); printf("Un\n"); printf("Defaut\n");
Si "a" vaut 1, seules les instructions :
sont exécutées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 printf("Un\n"); printf("Defaut\n");
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 :
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 int a=0; if (a==0) { printf("Zero\n"); } else if (a==1) { printf("Un\n"); } else { printf("Defaut\n"); }
ce qui reviendrait à ajouter un test 'OU' à chaque fois, au fur et à mesure. Ca compliquerait le code donc.
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 */
Une discussion a évoluée vers la même question côté C++. Cf ici.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Partager