Bench: If ou switch
Une question qui revient régulièrement, le if est il plus rapide que le switch ?
Le but de ce benchmark est justement de répondre à cette question, en déterminant quelle est la structure conditionnelle la plus rapide entre le if et le switch.
Présentation des tests
Je vais après chaque test ajouter une condition dans chacune des structures.
Chaque test sur les structures sera exécutés 1000 fois.
Configuration utilisée lors des benchs :
- Machine : Linux 2.6.38-11-generic #50-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
- Php : PHP 5.3.6 (cli) Zend Engine v2.3.0
Pour les pressés
Rapport Test effectué Temps
100% if else 338.077 µs
110% switch case default 375.032 µs
100% if elseif else 494.003 µs
106% switch case case default 527.143 µs
100% if elseif elseif else 594.139 µs
106% switch case case case default 630.140 µs
100% if elseif elseif elseif else 815.868 µs
105% switch case case case case default 854.969 µs
Premier test
if et else
for($i = 0; $i < 1000; $i++)
if($sMyVar == "tes")
$s = "";
else
$s = "";
TIME : 338.077 µs
Switch case default
for($i = 0; $i < 1000; $i++)
switch($sMyVar) {
case "tes":
$s = "";
break;
default:
$s = "";
}
TIME : 375.032 µs
Résultats
100% if else
110% switch case default
Second test
if elseif else
for($i = 0; $i < 1000; $i++)
if($sMyVar == "tes")
$s = "";
elseif($sMyVar == "te")
$s = "";
else
$s = "";
TIME : 494.003 µs
Switch 2 case default
for($i = 0; $i < 1000; $i++)
switch($sMyVar) {
case "tes":
$s = "";
break;
case "te":
$s = "";
break;
default:
$s = "";
}
TIME : 527.143 µs
Résultats
100% if elseif else
106% switch case case default
Troisième test
if elseif elseif else
for($i = 0; $i < 1000; $i++)
if($sMyVar == "tes")
$s = "";
elseif($sMyVar == "te")
$s = "";
elseif($sMyVar == "t")
$s = "";
else
$s = "";
TIME : 594.139 µs
Switch 3 case default
for($i = 0; $i < 1000; $i++)
switch($sMyVar) {
case "tes":
$s = "";
break;
case "te":
$s = "";
break;
case = "t":
$s = "";
break;
default:
$s = "";
}
TIME : 630.140 µs
Résultats
100% if elseif elseif else
106% switch case case case default
Quatrième test
if elseif elseif elseif else
for($i = 0; $i < 1000; $i++)
if($sMyVar == "tes")
$s = "";
elseif($sMyVar == "te")
$s = "";
elseif($sMyVar == "t")
$s = "";
elseif($sMyVar == "")
$s = "";
else
$s = "";
TIME : 815.868 µs
Switch 4 case default
for($i = 0; $i < 1000; $i++)
switch($sMyVar) {
case "tes":
$s = "";
break;
case "te":
$s = "";
break;
case "t":
$s = "";
break;
case "":
$s = "";
break;
default:
$s = "";
}
TIME : 854.969 µs
Résultats
100% if elseif elseif elseif else
105% switch case case case case default
Conclusion
La structure if elseif est légèrement plus rapide que celle du switch. Je ne pense pas que la différence soit assez significative pour se poser la question de quelle structure utiliser pour l’optimisation, mais plutôt pour la lisibilité.
L’intérêt du SWITCH n’est pas fait pour une « simple » condition mais plus pour tester une variable à différentes valeurs.
).
Même si les deux permettent de faire les mêmes choses, comme tu le dis en conclusion, il s’agit surtout d’avoir un code lisible.
Pour tester 10 valeurs possibles pour une variable, le SWITCH s’impose (une cascade de IF… ça fait vraiment moisi comme méthode
Bon code !