Difference for_each et for

Bonjour,

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

merci d'avance

5 réponses

  1. Modérateur
    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. 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
    2. Modérateur
      Montre nous ton code pour qu'on te dise pourquoi tu obtiens ce résultat !
    3. 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
  2. chaque cas est unique, tu utilise ce que tu veux selon le cas
    1. 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.?
    2. 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
  3. Modérateur
    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. 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. 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
        1. le lien ne marche pas