Différences de perfs entre foreach et array_map

Différences de perfs entre foreach et array_map - PHP - Programmation

Marsh Posté le 03-09-2008 à 16:18:39    

Je voudrais savoir si y'avait une différence de perf entre une bouche foreach et utiliser la fonction array_map()? En gros, est-ce que array_map() fait de la parallélisation?  (éventuellement sous certaines  conditions, style avec un cpu dual core)
 
Merci.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-09-2008 à 16:18:39   

Reply

Marsh Posté le 03-09-2008 à 16:28:50    

Le mieux est de tester, mais ça m'étonnerait fortement qu'il y ait une différence significative. Et la parallèlisation d'une seule exécution d'un script php tu crois au père noël je crois...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 03-09-2008 à 16:32:13    

D'ailleurs je vois pas franchement l'intérêt qu'ils auraient à faire ça, du coté de la team php : php est fait principalement pour le web, et mieux vaut paralléliser pour traiter plusieurs requêtes à la fois que pour traiter plus vite une seule requête...[:petrus75]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 03-09-2008 à 16:51:44    

l'idée c'était qu'avec array_map(), ça aurait été bien que ça crée des thread pour chaque appel à la fonction callback :) Sur un dual core, ça aurait pu faire gagner en perf...
 
Mais bon, c'était un vœu pieu...

Message cité 1 fois
Message édité par rufo le 03-09-2008 à 16:52:10

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-09-2008 à 16:54:25    

generalement, php est utilisé pour un site web  
et souvent, un site web a  plus de visiteur en // que de core [:proy]

Reply

Marsh Posté le 03-09-2008 à 16:54:31    

ben non, rien n'indique que tes traîtements ne doivent pas être séquenciels. dont à ce moment ce sertait mal.

Reply

Marsh Posté le 03-09-2008 à 17:02:15    

Code :
  1. <?php
  2. function test($v){
  3.  global $valeur;
  4.  $valeur = $v;
  5.  sleep(1);
  6.  return $valeur;
  7. }
  8.  
  9. $valeur=0;
  10. echo 'mon tableau ? ';
  11. print_r(array_map('test',array(0,1,2,3,4,5,6,7,8,9)););
  12. echo 'ma valeur finale : ' . $valeur;


 
Question1 : Si array_map traite toutes les cases en parallèle, qu'elle est la valeur de $valeur?
Question2 : Si array_map traite toutes les cases en parallèle, qu'est ce que php affiche?
 
 
Comme tu vois il n'est pas possible de traiter les différentes cases du tableau en parallèle sans prendre le risque de se retrouver avec un résultat qui ne correspond pas du tout à ce qu'on est en droit d'attendre.
 
Côté optimisation, je dirais que la différence de vitesse entre un foreach et un array_map doit être du même niveau que " ' Vs " " (à vérifier pour chaque versions de php) avec un petit avantage pour le foreach qui à un appel de fonction en moins par case du tableau.
 
A noter aussi que array_map peut travailler sur plusieurs tableaux à la fois ce que ne permet pas foreach, il y a donc des cas où la question ne se pose même pas.

Reply

Marsh Posté le 03-09-2008 à 17:04:11    

skeye a écrit :

Le mieux est de tester, mais ça m'étonnerait fortement qu'il y ait une différence significative.


Bien au contraire, array_map génère un appel de fonction pour chaque item, et je doute très fort que les appels de fonctions soient très rapides dans PHP :D

 

Donc array_map est probablement largement plus lent que foreach :o

rufo a écrit :

l'idée c'était qu'avec array_map(), ça aurait été bien que ça crée des thread pour chaque appel à la fonction callback :) Sur un dual core, ça aurait pu faire gagner en perf...


Sauf que PHP n'est pas un langage "pur" (et qu'il n'est pas possible d'annoter des fonctions pour spécifier leur pureté), donc le callback peut trivialement avoir des effets de bord, demandant à ce que l'exécution soit séquentielle. Elle peut aussi utiliser des données issues de son contexte (globale) que PHP ne pourra pas indiquer à array_map, interdisant là encore la parallélisation automatique. (edit: grillé par omega2 là dessus)

 

Enfin, ça serait de toute façon complètement con, un thread OS c'est un objet relativement lourd, créer un thread pour chaque item de l'itération prendrait un temps fou


Message édité par masklinn le 03-09-2008 à 17:04:51

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-09-2008 à 17:19:05    

ok, merci pour toutes vos réponses :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 08-09-2008 à 12:23:22    

Dans ton foreach, tu peux aussi améliorer les performances en utilisant une référence sur la valeur plutôt que la valeur directement.
 
$a = range(1,500);
foreach($a as &$b)
{
 $b = 2*$b;
}
 
Sera bien plus rapide que :
 
$a = range(1,500);
foreach($a as $k=>$b)
{
 $a[$k] = 2*$b;
}

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed