web-dev-qa-db-fra.com

Qu'est-ce qui est plus rapide et meilleur, Switch Case ou if else if?

Quelles sont les méthodes les meilleures et les plus rapides: if ou switch?

if(x==1){
  echo "hi";
} else if (x==2){
  echo "bye";
}

switch(x){
  case 1
    ...
  break;
  default;
} 
57
Ballu Rocks

Votre premier exemple est tout simplement faux. Vous avez besoin de elseif au lieu de else.

Si vous utilisez if..elseif... ou switch, c'est principalement une question de préférence. La performance est la même.

Toutefois, si toutes vos conditions sont du type x == value, avec x identique, switch est généralement utile. De plus, je n’utiliserais que switch s’il y en avait plus que p. Ex. deux conditions.

Un cas où switch vous donne réellement un avantage en termes de performances est si la partie variable est un appel de fonction:

switch(some_func()) {
    case 1: ... break;
    case 2: ... break;
}

Alors some_func() est appelé une seule fois avec

if(some_func() == 1) {}
elseif(some_func() == 2) {}

il serait appelé deux fois - y compris les effets secondaires possibles de l'appel de fonction se produisant deux fois. Toutefois, vous pouvez toujours utiliser $res = some_func();, puis $res dans vos conditions if - afin d'éviter ce problème.

Un cas où vous ne pouvez pas utiliser du tout est lorsque vous avez des conditions plus complexes - switch ne fonctionne que pour x == y, avec y étant une valeur constante.

119
ThiefMaster

Selon phpbench.com , si/elseif est légèrement plus rapide, en particulier lors de l’utilisation de comparaisons strictes (===). 

 enter image description here

Mais ce n’est vraiment important que si vous voulez économiser des microsecondes sur une fonction appelée des milliers de fois.

19
Guest

La règle générale est utilisez switch lorsque le nombre de conditions est supérieur à 3 (pour la lisibilité).

ifelse if/else est plus flexible (donc meilleur), mais switch est légèrement plus rapide car il calcule simplement la condition une fois, puis vérifie la sortie, alors que if doit le faire à chaque fois.

_/EDIT: On dirait que switch EST PLUS LENT QUE if après tout, je pourrais jurer que ce n'était pas le cas ...

14
Alix Axel

Cela dépend de l'utilisation. Si vous avez le statut fxp (en ligne, en déplacement, en déplacement, hors connexion, etc.), son meilleur commutateur d’utilisation.

switch(status)
{
case 'online':
...
}

Mais si tu veux quelque chose comme ça

if ((last_reply.ContainsKey(name)) && (last_reply[name] < little_ago))

ou 

if (msg.ToString()[0] == '!')

sa meilleure utilisation si d'autre.

2
sczdavos

Lorsque vous utilisez ==, les performances de if ... elseif par rapport à switch sont presque identiques. Cependant, avec ===, if ... elseif est environ 3 fois plus rapide (selon: phpbench ).

En règle générale, vous devriez utiliser ce qui est le plus lisible et utiliser switch lorsque vous effectuez plus de 3 comparaisons. Si les performances sont une préoccupation majeure et que vous n'avez pas besoin de convertir les types, utilisez if ... elseif avec ===.

2
Dan Bray

à mon avis le "si/d'autre" est plus rapide mais pas meilleur que le commutateur.

echo ($x==1?"hi":($x==2?"bye":""));

si vous devez faire 1,2 cas comme si/else if/else

1
user1299518

Je pense que le compilateur les transformera en un code très similaire, voire identique, à la fin de la journée. 

Sauf si vous faites quelque chose de bizarre, n'essayez pas d'optimiser le compilateur. 

De plus, le temps passé par le développeur est généralement plus important que l'exécution (à l'exception des jeux). 

0
will