Tout d'abord, je comprends que dans 90% des applications, la différence de performance est complètement hors de propos, mais j'ai juste besoin de savoir quelle est la construction la plus rapide. Cela et ...
Les informations actuellement disponibles à leur sujet sur le net prêtent à confusion. Beaucoup de gens disent que foreach est mauvais, mais techniquement, il devrait être plus rapide car il est supposé simplifier l'écriture d'un parcours de tableau à l'aide d'itérateurs. Les itérateurs, qui sont à nouveau supposés être plus rapides, mais en PHP sont aussi apparemment très lents (ou n'est-ce pas une chose PHP?). Je parle des fonctions de tableau: next () prev () reset () etc. eh bien, si ce sont même des fonctions et non une de ces fonctionnalités du langage PHP qui ressemblent à des fonctions.
Pour affiner un peu ceci : je ne suis pas intéressé à parcourir des tableaux par pas de plus de 1 (pas d'étapes négatives non plus, c'est-à-dire. Itération inverse). Je ne suis pas non plus intéressé par un parcours vers et depuis des points arbitraires, juste 0 à la longueur. Je ne vois pas non plus la manipulation de tableaux avec plus de 1000 clés sur une base régulière, mais je vois un tableau traversé plusieurs fois dans la logique d'une application! Aussi pour les opérations, en grande partie uniquement la manipulation et l'écho de chaînes.
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 lent, et doncfor
/while
est plus rapide- PHPs
foreach
copie le tableau sur lequel il itère; pour accélérer les choses, vous devez utiliser des références - code comme celui-ci:
$key = array_keys($aHash); $size = sizeOf($key);
est plus rapide qu'un
for ($i=0; $i < $size; $i++)foreach
Voici mon problème. J'ai écrit ce script de test: http://pastebin.com/1ZgK07US et quel que soit le nombre de fois que je lance le script, j'obtiens quelque chose comme ceci:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
En bref:
foreach
est plus rapide queforeach
qu'avec référenceforeach
est plus rapide quefor
foreach
est plus rapide quefor
pour une table de hachage
Quelqu'un peut-il expliquer?
- Est-ce que je fais quelque chose de mal?
- PHP foreach fait-il vraiment une différence? Je veux dire pourquoi ne le copierait-il pas si vous passez par référence?
- Quel est le code d'itérateur équivalent pour l'instruction foreach; J'en ai vu quelques-uns sur le net, mais à chaque fois que je les teste, le timing est très éloigné; J'ai également testé quelques constructions d'itérateurs simples, mais je ne semble jamais obtenir de résultats même décents - les itérateurs de tableau en PHP sont-ils simplement horribles?
- Existe-t-il des moyens / méthodes / constructions plus rapides pour parcourir un tableau autre que FOR / FOREACH (et WHILE)?
PHP version 5.3.0
Edit: Answer Avec l'aide de personnes ici, j'ai pu rassembler les réponses à toutes les questions. Je vais les résumer ici:
- "Est-ce que je fais quelque chose de mal?"Le consensus semble être: oui, je ne peux pas utiliser l'écho dans les benchmarks. Personnellement, je ne vois toujours pas en quoi l'écho est une fonction avec un temps d'exécution aléatoire ou en quoi une autre fonction est en quelque sorte différente - cela et la capacité de ce script à générer exactement les mêmes résultats de foreach mieux que tout est difficile pour expliquer si juste "vous utilisez echo" (enfin ce que j'aurais dû utiliser). Cependant, je reconnais que le test devrait être fait avec quelque chose de mieux; bien qu'un compromis idéal ne me vienne pas à l'esprit.
- "Est-ce que PHP pour chaque référence fait vraiment une différence? Je veux dire pourquoi ne le copierait-il pas si vous passez par référence?" ircmaxell montre que oui, des tests supplémentaires semblent prouver dans la plupart des cas que la référence devrait être plus rapide - bien que compte tenu de mon extrait de code ci-dessus, cela ne signifie certainement pas tout. J'accepte que le problème soit probablement trop peu intuitif pour être dérangé à un tel niveau et qu'il faudrait quelque chose d'extrême comme la décompilation pour déterminer ce qui est le mieux pour chaque situation.
- "Quel est le code d'itérateur équivalent pour l'instruction foreach? J'en ai vu quelques-uns sur le net mais à chaque fois que je les teste, le timing est très éloigné. J'ai également testé quelques constructions d'itérateur simples mais je ne semble jamais obtenir de résultats même décents - les itérateurs de tableaux en PHP sont-ils vraiment horribles? " ircmaxell a fourni la réponse ci-dessous; bien que le code ne soit valide que pour la version PHP> = 5
- "Existe-t-il des moyens / méthodes / constructions plus rapides pour parcourir un tableau autre que FOR / FOREACH (et WHILE)?" Merci à Gordon pour la réponse. L'utilisation de nouveaux types de données dans PHP5 devrait améliorer les performances ou la mémoire (ce qui peut être souhaitable selon votre situation). Bien que beaucoup de nouveaux types de tableaux ne semblent pas être meilleurs que array () en termes de vitesse, splpriorityqueue et splobjectstorage semblent être nettement plus rapides. Lien fourni par Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Merci à tous ceux qui ont essayé d'aider.
Je vais probablement m'en tenir à foreach (la version sans référence) pour toute traversée simple.