oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] Addition champs array multidimensionnel
Tiens marrant, tu parlais de benchmark foireux, les miens ne le sont pas, mais les tiens si.
Premier point : ne jamais enchain er les benchmark.
Pourquoi ? Car la machine a été chargé, en cpu ou en mémoire, il faut la laisser se reposer entre les différents benchmark pour des comparatifs optimals.
Deuxième point : ne pas surcharger de code inutile pour prendre les mesures.
Pourquoi ? Car tu rajoutes plein de conditions dans l'exécution du code (pas des conditions dans le sens IF) que tu ne maitrises pas, car tu ne connais pas du tout la façon dont l'exécuteur PHP gère les choses, il faut donc minimiser au maximum tout le code de mesure, c'est pour ça que le miens est ultra minimale avec juste "microtime(true)".
Dernier point : Tu ne fais pas de reset($arrays) pour ton test avec le while, donc la première fois il itère bien, toutes les autres, il n'itère pas il est déjà à la fin du tableau.
Donc avec le reset($arrays) ajouté pour le while :
10.44 sec pour le while contre 3.54 pour le foreach
(Ce message a été modifié le : 08-16-2008 02:37 PM par oxman.)
|
|
| 08-16-2008 02:34 PM |
|
z3d
Membre
Messages : 102
Inscription : Apr 2008
Réputation : 4
|
RE: [Résolu] Addition champs array multidimensionnel
Effectivement, oublie du reset.
3 pages différentes et le resultat est sensiblement le même.
Citation :Affectation : 0ms
Mémoire utilisé : 62288
for : 2572ms
Mémoire utilisé : 63552
Citation :Affectation : 0ms
Mémoire utilisé : 61984
foreach : 1890ms
Mémoire utilisé : 63168
Citation :Affectation : 0ms
Mémoire utilisé : 62104
while, list : 874ms
Mémoire utilisé : 63248
(Ce message a été modifié le : 08-16-2008 02:49 PM par z3d.)
|
|
| 08-16-2008 02:47 PM |
|
Satevis
Membre
Messages : 49
Inscription : Aug 2008
Réputation : 0
|
|
| 08-16-2008 03:22 PM |
|
z3d
Membre
Messages : 102
Inscription : Apr 2008
Réputation : 4
|
RE: For contre Foreach
Là où je suis étonné c'est que dans mon précédent benchmark les valeurs du while sont sensiblement les mêmes, pourquoi ?
Après relecture du code, j'ai compris le comment, en fait entre le while et le foreach se trouve le for et celui-ci après ses itérations replace bel et bien le pointeur interne à zéro de ce fait les mesures sont tout à fait viable.
Par contre mon benchmark même si il est fait à la chaîne prends en compte ce qui se passe précédemment hormis pour la consommation mémoire qui apparemment n'a pas l'air d'augmenter. De plus, comme on peut le voir que le bench soit scinder en 3 parties ou cumulé donne les même résultats.
Trouves-tu cela étonnant ?
Attention oxman je ne fait ma tête de mule comme tu peux le constater j'ai fait mon mea culpa sur le foreach dans un de mes précédents post
Edit : effectivement, un sujet a dévié sur ce point mais cette fois sephi nous a fait l'honneur de scinder le sujet pour que l'on puisse accentuer nos interactions sur ce sujet, on ne peut que l'en remercier
(Ce message a été modifié le : 08-16-2008 03:35 PM par z3d.)
|
|
| 08-16-2008 03:29 PM |
|
Eluox
Membre
Messages : 935
Inscription : Oct 2007
Réputation : 8
|
RE: For contre Foreach
J'ai fait des petits test, je vous donne le code, j'ai peut-être mal fait le truc.
Chez moi le plus rapide reste le while, suivit du foreach et ensuite du for
J'ai fait sa en 3 pages séparés et lancé a quelques minutes d'intervalles.
Le while
Code PHP :
<?php $arrays = array(); $arrays[] = array('name' => 'Premier', 'number' => 5, 'bim' => 2, 'boum' => 3); $arrays[] = array('name' => 'Deuxieme', 'number' => 2, 'bim' => 4, 'boum' => 2); $arrays[] = array('name' => 'Dernier', 'number' => 4, 'bim' => 6, 'boum' => 6);
$start = microtime(true); for($z = 0; $z < 1000000; $z++) { $sum = 0; while(list($key, $value) = each($arrays)) { $sum += $arrays[$key]['number']; } } $end = microtime(true);
echo 'Vitesse : '.($end - $start) . "<br />"; echo 'Memoire : '.memory_get_usage() . "<br />"; ?>
Le foreach
Code PHP :
<?php $arrays = array(); $arrays[] = array('name' => 'Premier', 'number' => 5, 'bim' => 2, 'boum' => 3); $arrays[] = array('name' => 'Deuxieme', 'number' => 2, 'bim' => 4, 'boum' => 2); $arrays[] = array('name' => 'Dernier', 'number' => 4, 'bim' => 6, 'boum' => 6);
$start = microtime(true); for ($z = 0; $z < 1000000; $z++) { $sum = 0; foreach($arrays as $key => $value) { $sum += $arrays[$key]['number']; }
} $end = microtime(true);
echo 'Vitesse : '.($end - $start) . "<br />"; echo 'Memoire : '.memory_get_usage() . "<br />"; ?>
Le for
Code PHP :
<?php $arrays = array(); $arrays[] = array('name' => 'Premier', 'number' => 5, 'bim' => 2, 'boum' => 3); $arrays[] = array('name' => 'Deuxieme', 'number' => 2, 'bim' => 4, 'boum' => 2); $arrays[] = array('name' => 'Dernier', 'number' => 4, 'bim' => 6, 'boum' => 6);
$start = microtime(true); for ($z = 0; $z < 1000000; $z++) { $iArray = count($arrays); $iSum = 0; for($i = 0; $i < $iArray; $i++) { $iSum += $arrays[$i]['number']; }
} $end = microtime(true);
echo 'Vitesse : '.($end - $start) . "<br />"; echo 'Memoire : '.memory_get_usage() . "<br />"; ?>
Et les résultats :
While :
Vitesse : 1.003350019455
Memoire : 57904
Foreach :
Vitesse : 2.0014398097992
Memoire : 57488
For :
Vitesse : 2.6591360569
Memoire : 57672
Edit : J'avais inversé les résultats, le foreach est deuxième, mais le while est bien premier
(Ce message a été modifié le : 08-16-2008 03:42 PM par Eluox.)
|
|
| 08-16-2008 03:36 PM |
|
Sephi-Chan
Administrateur
      
Messages : 4,490
Inscription : Aug 2006
|
RE: For contre Foreach
z3d a écrit :Edit : effectivement, un sujet a dévié sur ce point mais cette fois sephi nous a fait l'honneur de scinder le sujet pour que l'on puisse accentuer nos interactions sur ce sujet, on ne peut que l'en remercier 
Tu crois pas si bien dire. J'ai fucké ton message en scindant les sujets ! Alors pour me rattraper j'ai l'ai cité dans le premier message de cette discussion.
C'est vraiment chiant de scinder une discussion comme je l'ai fais : j'ai dû sélectionner chaque message que je voulais voir partir dans l'autre sujet ! Je pensais que tous ceux situés après le message que je marque partiraient… :/
Faut que je me fasse à la modération de masse.
Sephi-Chan
www.sephi-chan.fr
|
|
| 08-16-2008 03:36 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: For contre Foreach
Vous faites exprès de ne pas prendre en compte la remarque la plus importante des 3 ?
reset($arrays); !!!!!
Testez ce code :
Code PHP :
$arrays = array(); $arrays[] = array('name' => 'Premier', 'number' => 5, 'bim' => 2, 'boum' => 3); $arrays[] = array('name' => 'Deuxieme', 'number' => 2, 'bim' => 4, 'boum' => 2); $arrays[] = array('name' => 'Dernier', 'number' => 4, 'bim' => 6, 'boum' => 6);
$loop = 100000;
for($z = 0; $z < $loop; $z++) { $sum = 0; while(list($key, $value) = each($arrays)) { echo "Loop\n"; $sum += $arrays[$key]['number']; } }
Ca ne vous semble pas bizarre de ne voir afficher que 3 fois Loop au lieu de 300000 fois ?
Maintenant testez ça :
Code PHP :
$arrays = array(); $arrays[] = array('name' => 'Premier', 'number' => 5, 'bim' => 2, 'boum' => 3); $arrays[] = array('name' => 'Deuxieme', 'number' => 2, 'bim' => 4, 'boum' => 2); $arrays[] = array('name' => 'Dernier', 'number' => 4, 'bim' => 6, 'boum' => 6);
$loop = 100000;
for($z = 0; $z < $loop; $z++) { $sum = 0; reset($arrays); while(list($key, $value) = each($arrays)) { echo "Loop\n"; $sum += $arrays[$key]['number']; } }
300000 fois le Loop, là le test est correct.
Maintenant relisez mon message où je parlais du reset() si vous ne comprenez toujours pas.
(Ce message a été modifié le : 08-16-2008 03:41 PM par oxman.)
|
|
| 08-16-2008 03:40 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: For contre Foreach
Oui je confirme donc => "vous le faites exprès".
Conclusion :
1. foreach
2. for
3. while (list each)
Et je ne vais pas réexpliquer 50 fois pourquoi, je l'ai déjà fait deux fois.
Si au moins vous ne comprenez pas, dites moi le.
|
|
| 08-16-2008 03:48 PM |
|
Satevis
Membre
Messages : 49
Inscription : Aug 2008
Réputation : 0
|
RE: For contre Foreach
z3d relis le message d'avant le tiens  .
Si j'ai donné l'autre sujet ce n'est pas pour y répondre mais pour faire avancé le truc car dedans il y a déjà les réponse à qui est plus rapide que l'autre et pourquoi et que pour éviter qu'on refasse tout une seconde fois bah je l'ai donné  .
Et le podium est bien celui que oxman a donné.
|
|
| 08-16-2008 04:04 PM |
|
z3d
Membre
Messages : 102
Inscription : Apr 2008
Réputation : 4
|
RE: For contre Foreach
J'ai supprimé mon message d'avant celui d'oxman car il a raison sur son podium, j'ai malencontreusement, une nouvelle fois, oublié de rajouter ce satané reset() !
Attention à ne pas oublier quelques points important, while et foreach travaille sur une duplication des valeurs contrairement à for; notons toutefois que pour foreach une amélioration est apparue avec php5 on peut travailler avec des références, ce qui nous permet de travailler en direct sur le tableau et non sur sa valeur dupliqué.
|
|
| 08-16-2008 04:13 PM |
|