Poster une réponse 
 
Note de cette discussion :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu] For contre Foreach
Auteur Message
z3d Hors ligne
Membre

Messages : 102
Inscription : Apr 2008
Réputation : 4
Message : #11
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 34
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 ?

[Image: mielwar.ban.png]
(Ce message a été modifié le : 08-16-2008 01:16 PM par z3d.)
08-16-2008 01:12 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #12
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 ? 2
08-16-2008 01:17 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Sephi-Chan Hors ligne
Administrateur
*******

Messages : 4,492
Inscription : Aug 2006
Message : #13
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
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #14
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
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #15
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
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #16
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 2
08-16-2008 01:47 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Sephi-Chan Hors ligne
Administrateur
*******

Messages : 4,492
Inscription : Aug 2006
Message : #17
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 ? 34

www.sephi-chan.fr
08-16-2008 01:52 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #18
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
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
z3d Hors ligne
Membre

Messages : 102
Inscription : Apr 2008
Réputation : 4
Message : #19
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 61

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 :(

[Image: mielwar.ban.png]
(Ce message a été modifié le : 08-16-2008 02:28 PM par z3d.)
08-16-2008 02:26 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Eluox Hors ligne
Membre

Messages : 935
Inscription : Oct 2007
Réputation : 8
Message : #20
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

[Image: eluox010.png]
(Ce message a été modifié le : 08-16-2008 02:35 PM par Eluox.)
08-16-2008 02:29 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse 



ContactJeuWeb (JeuPHP) - Crée ton jeu par navigateurRetourner en hautRetourner au contenuVersion bas-débit (Archivé)Syndication RSS