Différences de perfs entre foreach et array_map - PHP - Programmation
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...
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...
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...
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
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.
Marsh Posté le 03-09-2008 à 17:02:15
Code : |
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.
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
Donc array_map est probablement largement plus lent que foreach
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
Marsh Posté le 03-09-2008 à 17:19:05
ok, merci pour toutes vos réponses
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;
}
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