Bench: If ou switch

By | 24 septembre 2011

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é.

Category: Php
  • 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 ! 😉