La Performance de foreach, array_map avec lambda et array_map avec fonction statique
Quelle est la différence de performances (si il y en a un) entre ces trois approches, à la fois utilisé pour transformer un tableau à un autre tableau?
- À l'aide de
foreach
- À l'aide de
array_map
avec lambda/fermeture de la fonction - À l'aide de
array_map
avec "statique" de la fonction/méthode - Est-il une autre approche?
À me faire comprendre, voyons les exemples, tous font le même multipliant la matrice de nombres de 10:
$numbers = range(0, 1000);
Foreach
$result = array();
foreach ($numbers as $number) {
$result[] = $number * 10;
}
return $result;
Carte avec lambda
return array_map(function($number) {
return $number * 10;
}, $numbers);
Carte avec "statique" de la fonction, passé en tant que chaîne de référence
function tenTimes($number) {
return $number * 10;
}
return array_map('tenTimes', $numbers);
Est-il une autre approche? Je serai heureux d'entendre réellement tous différences entre les cas à partir de ci-dessus, et toutes les entrées pourquoi on devrait être utilisé à la place des autres.
- Pourquoi ne pas vous venez de référence et de voir ce qui se passe?
- Eh bien, je peut faire un test. Mais je ne sais toujours pas comment ça fonctionne en interne. Même si je trouve l'un est plus rapide, je ne sais toujours pas pourquoi. C'est à cause de la version de PHP? Cela dépend-il les données? Est-il une différence entre associatifs et de simples tableaux? Bien sûr, je peux faire toute suite de points de référence, mais l'obtention de certains théorie enregistre ici beaucoup de temps. J'espère que vous comprenez...
- Fin de commentaire, mais ce n'est pas while( list($k, $v)= each($tableau)) plus rapide que tous les ci-dessus? Je n'ai pas comparé ce en php5.6, mais c'était dans les versions antérieures.
Vous devez vous connecter pour publier un commentaire.
FWIW, je viens de faire le test depuis l'affiche n'a pas fait. En cours d'exécution sur PHP 5.3.10 + XDebug.
Mise à JOUR 2015-01-22 comparer avec mcfedr la réponse ci-dessous pour des résultats sans XDebug et une plus récente version de PHP.
- Je obtenir de jolis résultats cohérents avec 1M numéros entre une douzaine de tentatives:
En supposant que l'atonie de la vitesse de la carte de la fermeture a été causé par la fermeture éventuellement être évalués à chaque fois, j'ai aussi testé comme ceci:
Mais les résultats sont identiques, confirmant que la fermeture n'est évaluée qu'une fois.
2014-02-02 mise à JOUR: opcodes de vidage
Voici l'opcode décharges pour les trois rappels. Première
useForeach()
:Puis le
useMapClosure()
et de la fermeture il appelle:
puis le
useMapNamed()
fonction:et le nom de la fonction qu'il appelle,
_tenTimes()
:useMapNamed
est effectivement plus rapide queuseArray
. Pensé que c'était la peine de mentionner.lap
, ne voulez-vous pas lerange()
appel ci-dessus, la première microtime appel? (Mais probablement insignifiant en comparaison avec le temps de la boucle.)foreach
est encore plus rapide, les trois méthodes ont réduit l'écart considérable au point d'en être presque identique à la vitesse.Son intéressant pour exécuter ce test avec xdebug désactivé, comme xdebug ajoute beaucoup de frais généraux, esp pour les appels de fonction.
C'est MGF du script exécuté à l'aide de 5.6
Avec xdebug
Sans xdebug
Ici il n'y a qu'une très petite différence entre le foreach et de fermeture de version.
Il est aussi intéressant d'ajouter une version avec une fermeture avec un
use
Pour la comparaison, j'ai ajouté:
Ici, nous pouvons voir qu'il a un impact sur la fermeture de la version, alors que le tableau n'a pas sensiblement changé.
19/11/2015 j'ai aussi maintenant ajouté les résultats à l'aide de PHP 7 et HHVM à des fins de comparaison. Les conclusions sont similaires, si tout est beaucoup plus rapide.
array_map
(et de ses fonctionsarray_reduce
,array_filter
) vous permettent d'écrire du code. Siarray_map
a été beaucoup plus lente, ce serait une raison d'utiliserforeach
, mais son très similaire, donc je vais utiliserarray_map
partout où cela a du sens.array_map
est beaucoup plus facile à lire et à écrire, et le développeur du temps est beaucoup plus cher que les cycles de processeur. La lecture d'une boucle n'est pas difficile, mais il prend plus de temps pour réaliser que c'est juste faire une carte. Mieux vaut dire que l'avant jusqu'en appelant la fonction map.C'est intéressant. Mais, j'ai obtenu un résultat inverse avec les codes suivants qui sont simplifiées à partir de mes projets en cours:
Voici mon test, les données et les codes:
Le résultat est:
Mes tests ont été dans la LAMPE environnement de production sans xdebug.
Je suis errant xdebug serait de ralentir array_map de la performance.
array_map
😉array_map
etforeach
à l'aide de Xhprof. Et Son intéressantearray_map
consomme plus de mémoire que ` foreach`.