z3d
Membre
Messages : 102
Inscription : Apr 2008
Réputation : 4
|
RE: [Résolu] Addition champs array multidimensionnel
C'est pas de la mauvaise fois, benchmarker c'est bien mais encore faut-il le faire sérieusement hein 
foreach est et sera toujours plus consommateur que for et ceux dans tous les domaines.
Sinon qu'elle est la principale différence entre for et foreach ?
(Ce message a été modifié le : 08-16-2008 01:16 PM par z3d.)
|
|
| 08-16-2008 01:12 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] Addition champs array multidimensionnel
Bon maintenant on remet en cause les benchmark, tu vas finir par admettre que tu as tort, voici mes codes pour mes benchmarks :
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);
$start = microtime(true); for ($z = 0; $z < 1000000; $z++) { $sum = 0; foreach($arrays as $key => $value) { $sum += $arrays[$key]['number']; }
} $end = microtime(true);
echo ($end - $start) . "\n"; echo memory_get_usage() . "\n";
et
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);
$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 ($end - $start) . "\n"; echo memory_get_usage() . "\n";
En quoi ils sont faux mes bench ?
|
|
| 08-16-2008 01:17 PM |
|
Sephi-Chan
Administrateur
      
Messages : 4,492
Inscription : Aug 2006
|
RE: [Résolu] Addition champs array multidimensionnel
J'ai fais ces tests (en local) et mes résultats donnent toujours le foreach plus rapide, mais un poil plus gourmand en mémoire.
Code :
For
Time : 1.23837614059
Memory : 64816
*****
Foreach
Time : 0.968640089035
Memory : 65076
Code :
For
Time : 1.32175087929
Memory : 54504
*****
Foreach
Time : 1.01163816452
Memory : 54764
Sephi-Chan
www.sephi-chan.fr
(Ce message a été modifié le : 08-16-2008 01:38 PM par Sephi-Chan.)
|
|
| 08-16-2008 01:35 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] Addition champs array multidimensionnel
Testé sur une autre machine :
For :
1.7432141304
42304
Foreach :
1.44215893745
42128
Attention donc, des modules tel que xdebug donnent des résultats faux pour les benchmark.
(Ce message a été modifié le : 08-16-2008 01:40 PM par oxman.)
|
|
| 08-16-2008 01:39 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] Addition champs array multidimensionnel
Testé sur une autre machine de nouveau :
For :
3.7616410255432
82192
Foreach :
1.7875909805298
81352
Oui en effet sur cette dernière machine, foreach est vraiment beaucoup plus rapide que for, c'est PHP 5.1.6 qui est installé.
|
|
| 08-16-2008 01:46 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] Addition champs array multidimensionnel
Sur 3 machines différentes le foreach est à la fois plus rapide et léger.
Sur 1 il est plus rapide mais plus lourd.
Regarde les modules que tu as d'activé dans PHP, je pense que ça explique la différence
|
|
| 08-16-2008 01:47 PM |
|
Sephi-Chan
Administrateur
      
Messages : 4,492
Inscription : Aug 2006
|
RE: [Résolu] Addition champs array multidimensionnel
Sur un FTP Free, sur 100000 itérations (le serveur ne voulait pas en faire 1000000) :
Code :
For
Time : -0.370811
Memory : 43624
*****
Foreach
Time : -0.237582
Memory : 44216
Sephi-Chan, quelqu'un peut me dire pourquoi les durées sont négatives ?
www.sephi-chan.fr
|
|
| 08-16-2008 01:52 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] Addition champs array multidimensionnel
Car tu es pas en PHP 5 et donc il ne prends pas les microsecondes et donc la valeur est trop imprécise pour un si petit temps.
|
|
| 08-16-2008 01:57 PM |
|
z3d
Membre
Messages : 102
Inscription : Apr 2008
Réputation : 4
|
RE: [Résolu] Addition champs array multidimensionnel
Alors franchement je suis bluffé pour le foreach il a subit une amélioration bien plus que notable
Par contre une chose à noter à la palce de foreach j'utilise toujours while couplé à list et each et dire que c'est la meilleur solution ce n'est pas peu dire.
Voici ma suite de test : Code PHP :
<?php function getmicrotime() { // découpe le tableau de microsecondes selon les espaces list($usec, $sec) = explode(" ",microtime());
// replace dans l'ordre return ((float)$usec + (float)$sec); }
function benchmark ($nom_etape) { global $etape_prec; $temps_ecoule = ($etape_prec) ? round((getmicrotime() - $etape_prec)*1000) : 0; $retour = '<p class="alerte"><strong>' . $nom_etape . ' : </strong>' . $temps_ecoule . 'ms<br />'. '<strong>Mémoire utilisé : </strong>'.memory_get_usage().'</p>'; $etape_prec = getmicrotime(); return $retour; }
//--------------------------------- $loop = 1000000; //--------------------------------- $arrays = array( array('name' => 'Premier', 'number' => 5, 'bim' => 2, 'boum' => 3), array('name' => 'Deuxieme', 'number' => 2, 'bim' => 4, 'boum' => 2), array('name' => 'Dernier', 'number' => 4, 'bim' => 6, 'boum' => 6) ); echo benchmark("Affectation"); //--------------------------------- for($z = 0; $z < $loop; $z++) { $sum = 0; foreach($arrays as $key => $value) { $sum += $arrays[$key]['number']; } } echo benchmark("foreach"); //--------------------------------- for($z = 0; $z < $loop; $z++) { $iArray = count($arrays); $iSum = 0; for($i = 0; $i < $iArray; $i++) { $iSum += $arrays[$i]['number']; } } echo benchmark("for"); //--------------------------------- for($z = 0; $z < $loop; $z++) { $sum = 0; while(list($key, $value) = each($arrays)) { $sum += $arrays[$key]['number']; } } echo benchmark("while, list");
?>
Résultat de mon dernier refresh :
Affectation : 0ms
Mémoire utilisé : 67272
foreach : 2112ms
Mémoire utilisé : 68384
for : 2618ms
Mémoire utilisé : 68664
while, list : 928ms
Mémoire utilisé : 68712
Edit : Si quelqu'un a un lien officiel sur l'amélioration de foreach, je suis preneur, je n'ai trouvé que l'amélioration qui permet à foreach de travailler en écriture sur le tableau :(
(Ce message a été modifié le : 08-16-2008 02:28 PM par z3d.)
|
|
| 08-16-2008 02:26 PM |
|
Eluox
Membre
Messages : 935
Inscription : Oct 2007
Réputation : 8
|
RE: [Résolu] Addition champs array multidimensionnel
En local sur mon pc :
Citation :Affectation : 0ms
Mémoire utilisé : 67272
foreach : 1937ms
Mémoire utilisé : 68384
for : 2600ms
Mémoire utilisé : 68664
while, list : 962ms
Mémoire utilisé : 68712
En ligne sur mon hebergement :
Citation :Affectation : 0ms
Mémoire utilisé : 64064
foreach : 958ms
Mémoire utilisé : 65184
for : 1201ms
Mémoire utilisé : 65520
while, list : 489ms
Mémoire utilisé : 65588
http://www.eluox.fr/bench.php
(Ce message a été modifié le : 08-16-2008 02:35 PM par Eluox.)
|
|
| 08-16-2008 02:29 PM |
|