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;
}
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.
Selon phpbench.com , si/elseif est légèrement plus rapide, en particulier lors de l’utilisation de comparaisons strictes (===).
Mais ce n’est vraiment important que si vous voulez économiser des microsecondes sur une fonction appelée des milliers de fois.
La règle générale est utilisez switch
lorsque le nombre de conditions est supérieur à 3 (pour la lisibilité).
if
else 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 ...
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.
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 ===
.
à 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
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).