Le code utilisé pour le premier test :
function test(&$v,$k)
{
$v = "value = ".$v;
}
array_walk($this->arr, 'test');
Le code utilisé pour le second test :
array_walk($this->arr, create_function('&$v,$k', '$v = "value = ".$v;'));
Chaque test est effectué avec le même tableau de 100000 entrées (création du tableau : $this->arr = range(0, 100000);).
Les résultats :
- test 1 : 0.74749994278 secondes
- test 2 : 0.539376020432 secondes
edit : ajout du code source complet pour mieu comprendre (coup de bol, je ne l'avais pas supprimé)
<?php
class test
{
function test()
{
$this->arr = range(0, 100000);
}
function loop1()
{
function test(&$v,$k)
{
$v = "value = ".$v;
}
array_walk($this->arr, 'test');
}
function loop2()
{
array_walk($this->arr, create_function('&$v,$k', '$v = "value = ".$v;'));
}
function getExecutionTime($func)
{
$time_start = microtime_float();
$this->$func();
$time_end = microtime_float();
$time = $time_end - $time_start;
echo '<h1>'.$func.' : '.$time.'</h1>';
reset($this->arr);
}
}
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$test = new test();
$test->getExecutionTime('loop1');
$test->getExecutionTime('loop2');
?>
du coup, je me doit de donner quelques explications complémentaires 
le & devant une variable permet de passer le paramètre par référence (et non pas par copie). Dans l'exemple, c'est utilisé dans la déclaration de fonction function test(&$v,$k) en fait si la valeur de $v est modifiée dans la fonction, la valeur de la variable passée en paramètre sera aussi modifiée car on travaille sur le même espace mémoire, ce qui donne un gain de performance.
Commentaires
1. Le mercredi 29 décembre 2004 à 11:59, par Alexandre
2. Le mercredi 29 décembre 2004 à 19:39, par paul
3. Le jeudi 30 décembre 2004 à 00:01, par Alexandre
4. Le jeudi 30 décembre 2004 à 01:13, par paul
5. Le mercredi 7 juin 2006 à 09:47, par tadalafil :: site
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.