35 votes

array_map vs boucle et opération

En utilisant:

 for($i=1; $i<= 10000; ++$i) {
    $arrayOfNumbers[] = rand(1, 99999);
}
 

Certains peuvent-ils expliquer pourquoi il existe une telle différence de vitesse:

 array_map(array($maxHeap, 'insert'), $arrayOfNumbers);
# Avg Time: 0.92856907844543s

# against

foreach($arrayOfNumbers as $number) {
    $maxHeap->insert($number);
}
# Avg Time: 1.3148670101166
 

$maxHeap étant un objet class MaxHeap extends SplMaxHeap

Merci d'avance pour votre explication!

14voto

scjr Points 71

À ma connaissance de php n'est pas faire du multithreading, comme mentionné par Sajith Amma.

Je soupçonne que c'est en fait due à des différences dans la recherche d' $maxHeap->insert.

Avec l' foreach boucle de la vous appelez $maxHeap->insert dans le champ d'application actuel, l'interprète php a regarder jusqu' maxHeap puis de recherche insert sur le maxHeap de l'instance. Dans le champ d'application du script en cours d'exécution, il pourrait y avoir d'autres variables qui peuvent rendre la recherche plus lent.

Avec l' array_map php sait qu'il va être l'appel de l'exacte même $maxHeap->insert, il peut faire la recherche juste une fois et utilisez la même adresse de code " pour le reste de la itérations.

2voto

Sajith Amma Points 350

Cela est dû à la différence entre les fonctions de rappel et les fonctions normales.

Dans le second, itération de tableau en utilisant foreach, chaque itération appelle la fonction "insert" et attend l'exécution (contrôle de retour de fonction) et passe à l'itération suivante.

Mais dans la fonction array_map, "insert" se produit comme fonction de rappel, il appelle "insert" et n'attend pas le résultat. Appelez insert avec l'élément suivant du tableau. Donc c'est plus rapide.

J'espère que ça aide.

-5voto

djot Points 2308

L'utilisation des objets est légèrement plus lent. Qui sont vos trois cas comparable? Ce n'cette méthode "insérer"? L'ajout de valeurs dans un tableau?

http://atomized.org/2009/02/really-damn-slow-a-look-at-php-objects/

Et quand vous êtes de lire ceci, vous pouvez regarder aussi ;)

http://atomized.org/2005/04/php-performance-best-practices/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X