Tout d'abord, je comprends que dans 90% des applications de la différence de performances est complètement hors sujet, mais j'ai juste besoin de savoir qui est le plus rapide à construire. Et...
Les informations actuellement disponibles sur le net est une source de confusion. Beaucoup de gens disent foreach est mauvais, mais, techniquement, il devrait être plus rapide car il est à supposer pour simplifier l'écriture d'un tableau de la traversée à l'aide des itérateurs. Les itérateurs, qui sont de nouveau supposons que pour être plus rapide, mais en PHP sont aussi apparemment mort lente (ou n'est-ce pas une chose PHP?). Je parle des fonctions de tableau: next() prev() reset (), etc. eh bien, si elles sont les même fonctions et pas un de ceux du langage PHP caractéristiques qui ressemblent à des fonctions.
Pour limiter cette baisse un peu: je ne suis pas intéressante en parcourant les tableaux dans les étapes de quelque chose de plus que de 1 (pas négatif des mesures soit, c'est à dire. inverse itération). Je ne suis pas intéressé par une traversée vers et à partir de points arbitraires, à seulement 0 de longueur. Aussi, je ne vois pas de manipuler des tableaux avec plus de 1000 clés qui se passe sur une base régulière, mais je vois un tableau traversée plusieurs fois dans la logique d'une application! Aussi, comme pour les opérations, principalement à la manipulation de la chaîne et de l'écho qui pratiquent.
Voici quelques sites de référence:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Ce que j'entends partout:
-
foreach
est lente, et doncfor
/while
est plus rapide - PHPs
foreach
des copies de l'ensemble qu'il parcourt; pour le rendre plus rapide vous avez besoin d'utiliser des références - code comme ceci:
$key = array_keys($aHash); $size = sizeOf($key);
est plus rapide qu'un
Voici mon problème. J'ai écrit ce script de test: http://pastebin.com/1ZgK07US et peu importe combien de fois je lance le script, j'obtiens quelque chose comme ceci:
for ($i=0; $i < $size; $i++)
En bref:
-
foreach
plus rapide que de l'foreach 1.1438131332397 foreach (using reference) 1.2919359207153 for 1.4262869358063 foreach (hash table) 1.5696921348572 for (hash table) 2.4778981208801
avec référence -
foreach
plus rapide que de l'foreach
-
foreach
plus rapide que de l'for
pour une table de hachage
Quelqu'un peut m'expliquer?
- Suis-je en train de faire quelque chose de mal?
- Est PHP foreach référence chose de vraiment faire une différence? Je veux dire, pourquoi ne serait-il pas le copier si vous passez par référence?
- Ce qui est l'équivalent d'itérateur code de l'instruction foreach; j'ai vu un peu sur le net, mais à chaque fois j'ai tester le timing est mauvais; j'ai aussi testé quelques itérateur simple constructions, mais ne semblent jamais à faire même des résultats décents -- sont la matrice des itérateurs en PHP juste horrible?
- Existe-il des façons plus rapides, méthodes et constructions de l'itération si un tableau autrement que POUR/FOREACH (et TOUT)?
La Version de PHP 5.3.0
Edit: Réponse
Avec l'aide de personnes ici, j'ai été en mesure de rassembler les réponses à toutes les questions. Je vais résumer ici:
- "Suis-je en train de faire quelque chose de mal?" Le consensus semble être: oui, je ne peux pas utiliser echo dans les benchmarks. Personnellement, je ne vois pas comment l'echo est une fonction aléatoire moment de l'exécution ou de la façon dont toute autre fonction qui est d'une certaine manière toute différente, -- que le script pour générer les mêmes résultats de foreach mieux que tout ce qui est dur à expliquer, si ce n'est que "vous êtes à l'aide de l'écho" (bien que je devrais avoir été utilisé). Cependant, je le concède, le test doit être fait avec quelque chose de mieux; cependant, un compromis idéal n'est pas venu à l'esprit.
- "Est PHP foreach référence chose de vraiment faire une différence? Je veux dire, pourquoi ne serait-il pas le copier si vous passez par référence?" ircmaxell montre que oui, il l'est, d'autres tests semble prouver dans la plupart des cas, il devrait être plus rapide-mais compte tenu de mon extrait ci-dessus du code, le plus certainement ne signifie pas que tous les. J'accepte le problème est probablement trop non intuitif de s'embêter avec un tel niveau et aurait besoin de quelque chose extrêmes, tels que la décompilation pour déterminer ce qui est mieux pour chaque situation.
- "Ce qui est l'équivalent d'itérateur code de l'instruction foreach; j'ai vu un peu sur le net, mais à chaque fois j'ai tester le timing est mauvais; j'ai aussi testé quelques itérateur simple constructions, mais ne semblent jamais à faire même des résultats décents -- sont la matrice des itérateurs en PHP juste horrible?" ircmaxell a fourni la réponse soufflet; si le code peut être seulement valide pour la version de PHP >= 5
- "Y at-il des façons plus rapides, méthodes et constructions de l'itération si un tableau autrement que POUR/FOREACH (et PENDANT)?" Merci à Gordon pour la réponse. En utilisant de nouveaux types de données en PHP5 devrait donner soit un gain de performances ou de la mémoire boost (soit de ce qui pourrait être souhaitable en fonction de votre situation). Même si la vitesse sage a beaucoup de nouveaux types de tableau ne semble pas être mieux que array(), le splpriorityqueue et splobjectstorage ne semblent être beaucoup plus rapide. Lien fourni par Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Merci à tous ceux qui ont essayé de l'aider.
Je vais probablement en tenir à foreach (le non-version de référence) pour une simple traversée.