Optimiser son code PHP, switch & if else

© Christian PAULUS. Document créé le 17 mai 2010 , mis à jour le 16 octobre 2010.

L'homme qui ne tente rien ne se trompe qu'une fois. Lao-Tseu

Accueil du site > Astuces > PHP > Optimiser son code PHP, switch & if else

Comparatif / PHP 5.3.2

Faut-il utiliser la structure de contrôle PHP switch ou le couple if else ?

Prenons ce petit script en exemple :

<?php

//
// Vérification optimisation code
//

define('LOOP'1000);

function 
def_array(&$r$i$e) {
    if(!isset(
$r[$i])) {
        
$r[$i] = array('min'=>$e'max'=>$e);
    }
    else {
        
$r[$i]['min'] = min($r[$i]['min'], $e);
        
$r[$i]['max'] = max($r[$i]['max'], $e);
    }
    return(
$r);
}

$cond = array('cherche' => array('loin' => 'très loin'));

$r = array();

for(
$jj=0$jj<10$jj++) {
    
    
//////////
    
$s microtime(1);
    for(
$ii=0$ii<LOOP$ii++) {
        switch(
$cond['cherche']['loin']) {
            case 
'ok1';
                
$s++;
                break;
            case 
'ok2';
                
$s++;
                break;
            case 
'ok3';
                
$s++;
                break;
            case 
'ok4';
                
$s++;
                break;
            case 
'ok5';
                
$s++;
                break;
        }
    }
    
$r def_array($r'switch'microtime(1) - $s);
    
    
//////////
    
$s microtime(1);
    for(
$ii=0$ii<LOOP$ii++) { 
        if(
$cond['cherche']['loin'] == 'ok1') {
            
$s++;
        }
        else if(
$cond['cherche']['loin'] == 'ok2') {
            
$s++;
        }
        else if(
$cond['cherche']['loin'] == 'ok3') {
            
$s++;
        }
        else if(
$cond['cherche']['loin'] == 'ok4') {
            
$s++;
        }
        else if(
$cond['cherche']['loin'] == 'ok5') {
            
$s++;
        }
    }
    
$r def_array($r'if'microtime(1) - $s);
    
}

echo(
'resultats:'.PHP_EOL
     
'- switch: '.$r['switch']['min']."\t".$r['switch']['max'].PHP_EOL 
     
'- if    : '.$r['if']['min']."\t".$r['if']['max'].PHP_EOL
     
);

?>

switch plus performant que if else 

Le résultat de ce test nous donne :

resultats:
- swicth: 0.00059604644775391        0.00079989433288574
- if    : 0.0010240077972412        0.0011019706726074

switch donne de meilleurs résultats que if else.

if else plus performant que switch

A vrai dire, la lourdeur du code ne vient pas de l’emploi de if else mais du paramètre utilisé $cond[’cherche’][’loin’] dans les étapes du if else. Si vous modifiez ce code par :

<?php

//
// Vérification optimisation code
//

define('LOOP'1000);

function 
def_array(&$r$i$e) {
    if(!isset(
$r[$i])) {
        
$r[$i] = array('min'=>$e'max'=>$e);
    }
    else {
        
$r[$i]['min'] = min($r[$i]['min'], $e);
        
$r[$i]['max'] = max($r[$i]['max'], $e);
    }
    return(
$r);
}

$cond = array('cherche' => array('loin' => 'très loin'));

$r = array();

for(
$jj=0$jj<10$jj++) {
    
    
//////////
    
$s microtime(1);
    for(
$ii=0$ii<LOOP$ii++) {
        switch(
$cond['cherche']['loin']) {
            case 
'ok1';
                
$s++;
                break;
            case 
'ok2';
                
$s++;
                break;
            case 
'ok3';
                
$s++;
                break;
            case 
'ok4';
                
$s++;
                break;
            case 
'ok5';
                
$s++;
                break;
        }
    }
    
$r def_array($r'switch'microtime(1) - $s);
    
    
//////////
    
$s microtime(1);
    for(
$ii=0$ii<LOOP$ii++) { 
        if((
$v $cond['cherche']['loin']) == 'ok1') {
            
$s++;
        }
        else if(
$v == 'ok2') {
            
$s++;
        }
        else if(
$v == 'ok3') {
            
$s++;
        }
        else if(
$v == 'ok4') {
            
$s++;
        }
        else if(
$v == 'ok5') {
            
$s++;
        }
    }
    
$r def_array($r'if'microtime(1) - $s);
    
}

echo(
'resultats:'.PHP_EOL
     
'- switch: '.$r['switch']['min']."\t".$r['switch']['max'].PHP_EOL 
     
'- if    : '.$r['if']['min']."\t".$r['if']['max'].PHP_EOL
     
);

?>

le résultat est tout autre :

- switch: 0.00059294700622559        0.00065994262695312
- if    : 0.00055694580078125        0.00060200691223145

et if else se révèle plus performant. De peu, de très peu même, mais bien réel.

Plussoyez !

Les forums sont fermés.