Difference for_each et for

Fermé
yuri648 Messages postés 677 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 20 mai 2015 - 10 janv. 2012 à 13:36
Emplet99 Messages postés 1 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 12 janvier 2012 - 12 janv. 2012 à 16:44
Bonjour,

la boucle for est plus rapide que la boucle for_each est ce que vous pouvez m'expliquer pourquoi??

merci d'avance

A voir également:

5 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
10 janv. 2012 à 13:53
Déjà je conteste ton affirmation comme quoi la boucle for est plus rapide que la boucle for_each. C'est peut-être vrai dans certains contextes, mais dans d'autres c'est la boucle for_each qui est la plus rapide, cela dépend de l'implémentation qui est faite, du langage dans lequel tu codes, et de la manière dont tu te sers de ces boucles.

Contre-exemple en Java avec une liste chaînée :

LinkedList<String> liste = new LinkedList<String> liste();
// ...
for (int i=0; i<liste.size(); i++)
    System.out.println(liste.get(i));

Cette boucle for est de complexité quadratique car en utilisant une liste chaînée, les appels à get(i) sont de complexité linéaire .

LinkedList<String> liste = new LinkedList<String> liste();
// ...
for (String s : liste) // for each en Java
    System.out.println(liste.get(i));

La boucle foreach est ici de complexité linéaire car elle utilise les itérateurs de la liste et se promène sur les éléments les uns à la suite des autres.

Dans ce contexte, la boucle for each est plus rapide que la boucle for, alors t'expliquer pourquoi la boucle for est plus rapide que la boucle for_each n'aurait pas de sens.
1
yuri648 Messages postés 677 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 20 mai 2015 7
10 janv. 2012 à 13:58
merci de m'avoir répondu

moi je l'ai testé dans les vecteurs
vector<int> myvector;

la boucle for etait plus rapide que la boucle for_each
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
10 janv. 2012 à 14:54
Montre nous ton code pour qu'on te dise pourquoi tu obtiens ce résultat !
0
Emplet99 Messages postés 1 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 12 janvier 2012
12 janv. 2012 à 16:44
ou bien alors ce que tu peux faire c'est d'aller directement sur le site de la prof ou bien lui envoyer un mail ...
Ca marche super bien :p ;D hin ? n'est-ce pas yuri :p
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
10 janv. 2012 à 14:00
chaque cas est unique, tu utilise ce que tu veux selon le cas
1
yuri648 Messages postés 677 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 20 mai 2015 7
10 janv. 2012 à 14:02
mais est ce que vous pouvez me donner une explication a mon cas
je veux dire le parcours des vecteurs est plus long avec la boucle for_each.?
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
10 janv. 2012 à 14:05
un vecteur d'entier n'est pas un type compliqué, donc la méthode pour parcourir chaque élément est linéaire, ya juste besoin de compter de 0 à 10 et tu récupère d'autres entier.
essaye en créant une classe de personne et fait un vecteur de personne en ressortant le nom d'une personne, normalement ça devrais être plus rapide pour le for each
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
10 janv. 2012 à 14:50
Je viens de faire des tests en C++ et je trouve comme en Java que la partie for_each qui utilise des itérateur est quasiment immédiate contrairement à for et for each :

for_each        0
for             1269
for each        6155


#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>

inline void todo(int i) 
{
	int j = i;
}

int main()
{
	clock_t start,finish;

	int n = (int) 4.5e8;
	std::vector<int> v(n);

	start = clock();
	for_each (v.begin(), v.end(), todo);
	finish = clock();
	printf ("for_each\t%ld\n", finish-start);

	start = clock();
	for (int i=0; i<n; i++)
		todo(v[i]);
	finish = clock();
	printf ("for\t\t%ld\n", finish-start);

	start = clock();
	for each (int i in v)
		todo(v[i]);
	finish = clock();
	printf ("for each\t%ld\n", finish-start);

	system("pause");
	return 0;
}
1
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
10 janv. 2012 à 15:10
Comme on a pu te dire cela depends juste du type de donnees que tu manipules.
Dans un cas le for sera plus rapide dans l'autre cas ca sera le foreach.

Si l'un etait TOUJOURS plus rapide que l'autre alors "l'autre" serai deprecie donc plus utilise ;)
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

forum.hardware.fr/hfr/.../PHP/foreach-php-sujet_45607_1.htmEn cache - Pages similaires

J'ai essayé ce lien:http://forum.hardware.fr/hfr/Programmation/PHP/foreach-php-sujet_45607_1.htm
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 )



*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
0
yuri648 Messages postés 677 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 20 mai 2015 7
10 janv. 2012 à 14:08
le lien ne marche pas
0