©
. Document créé le 17 mai 2010 , mis à jour le 16 octobre 2010.Les cons ça ose tout. C'est même àça qu'on les reconnaît. Michel Audiard
Accueil du site > Astuces > PHP > Optimiser son code PHP, switch & if else
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
);
?>
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.
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.
Les forums sont fermés.