1

Ce matin, avec un ami, on voulait optimiser certains de nos codes utilisant des opérations sur les tableaux, et on en est arrivé aux conclusions suivantes :

ce qui suit n'a été testé que sur des tableaux à une dimension, remplis d'entier ou de chaine de charactère, sous PHP5

ne pas utiliser array_merge, array_diff, in_array, et array_unique, les performances sont désastreuses quand on atteint des tableaux de plus de 1000 valeurs

préférer l'utilisation des fonctions suivantes :

// remplacer array_diff par :
function array_diff_perso($tab1, &$tab2)
{
  $tab1 = array_flip($tab1);
  foreach($tab2 as &$v) unset($tab1[$v]);
  return array_flip($tab1);
}

// remplacer in_array par :
function in_array_perso($val, &$tab1)
{
  $tmp = array_flip($tab1); // si dans une boucle, sortir cette ligne
  return isset($tmp[$val]); 
}

// remplacer array_unique par :
function array_unique_perso($tab)
{
  return array_flip(array_flip($tab)); 
}

// fonction array_merge sans doublon
function array_merge_unique($tab1, &$tab2)
{
  foreach ($tab2 as $v) $tab1[] = $v; // pour remplacer array_merge
  return array_flip(array_flip($tab1));
}

// fonction array_merge sans doublon optimisé pour tableaux sources sans doublon
function array_merge_unique($tab1, &$tab2)
{
  $tab1 = array_flip($tab1);
  foreach($tab2 as $v)
    if (!isset($tmp[$v]))
      $tab1[] = $v;
  return $tab1;
}


Lors de benchs, on passait parfois de plus de 80 secondes à 1,7 secondes !

d'une part, qu'en pensez vous ?, et d'autre part, avez vous également d'autres fonctions à éviter, avec des solutions de remplacement ?


Ancien pseudo : lolo

2

squale92 avait posté sur son blog quelques articles du même genre : http://blog.pascal-martin.fr/tag/performance

mais pour résumer le problème, les fonctions natives du PHP sont bien souvent aussi mal fichues que le langage lui-même, et on est obligé de perdre du temps avec ce genre d'astuce (qui se résume à combiner plusieurs fonctions pour en simuler une autre) pour gagner en performance :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

bon, ben en fait il était arrivé aux mêmes conclusions happy
Ancien pseudo : lolo