for vs foreach en PHP

for vs foreach en PHP - PHP - Programmation

Marsh Posté le 27-01-2004 à 12:06:23    

Vrai ou faux? Pour parcourir les éléments d'un tableau for est plus rapide que foreach, qui pourtant, est prévues exprès pour les tableaux...
 
Moi, j'ai fait un test, et c'est ce que j'ai pu constater, a priori (c'est l'impression que j'en ai eu quand j'affiche les temps d'éxécution d'une page).

Reply

Marsh Posté le 27-01-2004 à 12:06:23   

Reply

Marsh Posté le 27-01-2004 à 19:43:13    

tout comme le while est plus rapide que le for :)
 
Fait exprès signifie souvent simplifié, pas optimisé :)

Reply

Marsh Posté le 27-01-2004 à 23:15:54    

Ah bon le while est plus rapide ?  [:figti]


---------------
GENERATION MOBILES : Imprimantes GSM & logos/sonneries/jeux
Reply

Marsh Posté le 27-01-2004 à 23:31:48    

C'est pas flagrant et ça dépend beaucoup de la manière dont il est écrit.
 
Pour te donner une idée, voilà les résultats d'un bench sur un tableau de 10000 éléments (oui, quand même :D)
 

  • boucle For avec calcul de la taille hors de la boucle  

Résultat : 20000 temps d'exécution : 0.017132

  • boucle For avec calcul de la taille dans la boucle  

Résultat : 20000 temps d'exécution : 0.022836

  • boucle While avec instruction each  

Résultat : 20000 temps d'exécution : 0.035938

  • boucle Foreach  

Résultat : 20000 temps d'exécution : 0.020736

  • boucle While classique, calcul de la longueur hors boucle  

Résultat : 20000 temps d'exécution : 0.016767
 
C'est vraiment pas énorme entre le while et le for donc :)


Message édité par naceroth le 27-01-2004 à 23:32:43
Reply

Marsh Posté le 28-01-2004 à 09:42:02    

D'où ma 2ème question : quel est l'intérêt de foreach poir les tableaux par rapport à un bon vieux  

Code :
  1. for($i = 0 ; $i < count($tab) ; $i++)
  2. {
  3.     $tab[$i];
  4. }

Reply

Marsh Posté le 28-01-2004 à 10:43:04    

interet: pour les tableau associatif: array("couleur" => "rouge", "type"=>"blabla" )

Reply

Marsh Posté le 28-01-2004 à 13:30:16    

oui, pourquoi pas, ça se défend...

Reply

Marsh Posté le 28-01-2004 à 13:38:49    

Pourquoi faire compliqué quand on peut faire simple? Vu la difference de perfs minime je prefere utiliser le foreach. Je trouve ça bcp plus lisible.

Reply

Marsh Posté le 28-01-2004 à 13:41:27    

impulse a écrit :

Pourquoi faire compliqué quand on peut faire simple? Vu la difference de perfs minime je prefere utiliser le foreach. Je trouve ça bcp plus lisible.


 
C'est ce que j'ai fait, bien que ayant fait pas mal de C, je suis assez habitué au for(i =...)

Reply

Marsh Posté le 28-01-2004 à 17:01:11    

rufo a écrit :

D'où ma 2ème question : quel est l'intérêt de foreach poir les tableaux par rapport à un bon vieux  

Code :
  1. for($i = 0 ; $i < count($tab) ; $i++)
  2. {
  3.     $tab[$i];
  4. }




 
Remarque, tant qu'à optimiser, le count devrait être hors de la boucle for :D
 
Ceci dit, c'est juste une question de simplicité et de goût :)

Reply

Marsh Posté le 28-01-2004 à 17:01:11   

Reply

Marsh Posté le 28-01-2004 à 17:03:09    

j'adore ces concours de branlette de code pour gagner 0.0000004 s [:zytrahus5]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 29-01-2004 à 09:47:00    

naceroth a écrit :


 
Remarque, tant qu'à optimiser, le count devrait être hors de la boucle for :D
 
Ceci dit, c'est juste une question de simplicité et de goût :)


 
oui, t'as raison, une simple erreur de ma part ; c'est ce que je fais, naturellement

Reply

Marsh Posté le 29-01-2004 à 09:48:03    

simogeo a écrit :

j'adore ces concours de branlette de code pour gagner 0.0000004 s [:zytrahus5]


 
non, c'est juste une question de curiosité. Et puis, quand y'a pleins de personnes connectés en simultanné sur ton serveur, ces optimisations peuvent s'avérer utilent :)

Reply

Marsh Posté le 03-02-2004 à 00:07:15    

utiles [:aloy]
 
 
Un foreach, à l'inverse d'une boucle for, ne modifie pas le contenu du tableau qu'elle parcoure, exemple:

Code :
  1. <?php
  2. $tablo = array(25,36,10,5);
  3. foreach($tablo as $var)
  4. {
  5.    $var = 0;
  6. }
  7. printf $tablo;
  8. ?>

(désolé pour les erreurs de syntaxe dans le code, j'ai la flemme de vérifier :o )
 
==> le tablo est toujours avec ses valeurs d'origine, donc un foreach ne peut etre utilisé qu'en lecture car il ne travaille pas directement sur le tableau, alors qu'avec un while/for on fait ce qu'on veut.


Message édité par aspegic500mg le 03-02-2004 à 00:08:07
Reply

Marsh Posté le 03-02-2004 à 01:11:44    

simogeo a écrit :

j'adore ces concours de branlette de code pour gagner 0.0000004 s [:zytrahus5]


 
en même temps, c'est instructif et c'est toujours bien de chercher à tendre vers la perfection, quelque soit le domaine.  ;)

Reply

Marsh Posté le 03-02-2004 à 16:20:16    

aspegic500mg a écrit :

utiles [:aloy]
 
 
Un foreach, à l'inverse d'une boucle for, ne modifie pas le contenu du tableau qu'elle parcoure, exemple:

Code :
  1. <?php
  2. $tablo = array(25,36,10,5);
  3. foreach($tablo as $var)
  4. {
  5.    $var = 0;
  6. }
  7. printf $tablo;
  8. ?>

(désolé pour les erreurs de syntaxe dans le code, j'ai la flemme de vérifier :o )
 
==> le tablo est toujours avec ses valeurs d'origine, donc un foreach ne peut etre utilisé qu'en lecture car il ne travaille pas directement sur le tableau, alors qu'avec un while/for on fait ce qu'on veut.


 
La preuve que c'est instructif : personne jusqu'à présent n'avait parlé de ça!... Et ça pourrait être une source de bug pas facile à trouver pour celui qui n'est pas au courant que foreach ne travaille qu'en lecture sur des tableaux...

Reply

Marsh Posté le 03-02-2004 à 18:15:26    

rufo a écrit :


 
La preuve que c'est instructif : personne jusqu'à présent n'avait parlé de ça!... Et ça pourrait être une source de bug pas facile à trouver pour celui qui n'est pas au courant que foreach ne travaille qu'en lecture sur des tableaux...


 
Ben oui on travaille sur la variable "$var" et non sur le contenu du tableau, ca parait logique mais quand on connait pas il est facile de faire l'erreur :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed