IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[Performance] For Each et For i=0


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Par défaut [Performance] For Each et For i=0
    Bonjour à tous,

    Simple question de performance : quelle méthode est la plus efficace (rapport temps/mémoire) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim ch as checkbox
    for i=0 to grbox.controls.count
    ch=grbox.controls(i)
    if ch.checked then.....
    next
    ET

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for each ch to grbox.controls
    if ch.checked then ...
    next
    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Par défaut
    Salut,

    je l'ai appris a ma formation mais j'ai pas retenu ce que le formateur a dit mais par logique, je dirais que le foreach est + optimisé pour ton exemple...

    * initialisation du "i"
    * aller rechercher le nombre d'élément dans ton groupbox
    * incrémentation du "i"

    ça fait déjà 3 étapes en + que le foreach doit certainement gérer plus vite... (j'espère que je me trompes pas sinon mon formateur va me tuer )

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Par défaut
    Bonsoir SoBaKa,

    Oui mais, même avec un for each, VB doit "savoir" où il doit s'arrêter.
    Ceci sous entend qu'il fait un Count sur le groupbox et qu'il y aussi un compteur derrière.

    Non ?

  4. #4
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    pour ton example question sans importance , c'est de l'ordre de O(n) avec un n de plus assez petit quelque soit ton UI .

    donc si c'est pour ameliorer les performances , cherche ailleur.

    ps: pour la clarete du code je te conseillerai d'utiliser le plus possible les foreach a l'instar des for

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Pour la petite histoire, une boucle foreach est développée en interne comme le parcours d'un iterateur à l'aide d'unre boucle while.
    Le compilateur transforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(Control unControle in this.Controls)
    {
        // Stuff
    }
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IEnumerator e = this.Controls.GetEnumerator();
    while(e.MoveNext())
    {
        // Stuff
    }
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Je me suis deja interessé à la question et d'apres mon bench j'en ai conclu que le For Each etait plus rapide que le For i as integer...

    par contre les boucles While, Do until, Do While ont toute la meme vitesse
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Par défaut
    Bonjour tout le monde,

    Citation Envoyé par zeavan
    pour ton example question sans importance , c'est de l'ordre de O(n) avec un n de plus assez petit quelque soit ton UI .

    donc si c'est pour ameliorer les performances , cherche ailleur.

    ps: pour la clarete du code je te conseillerai d'utiliser le plus possible les foreach a l'instar des for
    Je ne cherche pas à améliorer les performances
    C'est de la simple curiosité.

    Citation Envoyé par SaumonAgile
    Pour la petite histoire, une boucle foreach est développée en interne comme le parcours d'un iterateur à l'aide d'unre boucle while.
    Le compilateur transforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(Control unControle in this.Controls)
    {
        // Stuff
    }
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IEnumerator e = this.Controls.GetEnumerator();
    while(e.MoveNext())
    {
        // Stuff
    }
    Merci pour l'info. Mais du coup le For each devrait être plus long non puisqu'il faut créer un itérateur en mémoire ?

    Citation Envoyé par Aspic
    Je me suis deja interessé à la question et d'apres mon bench j'en ai conclu que le For Each etait plus rapide que le For i as integer...

    par contre les boucles While, Do until, Do While ont toute la meme vitesse
    Au moins, on est sûr du résultat dans les fait mais par la théorie on dirait plus le contraire non ?

    .

  8. #8
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    tout dépens de ce que tu veux faire...

    Si tu veux lister quelque chose le mieux c'est le for i as integer...

    Si tu veux rechercher un element précis dans une collection, le mieux est d'utiliser un For Each...

    Voila ^^
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  9. #9
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    Citation Envoyé par Aspic
    Si tu veux lister quelque chose le mieux c'est le for i as integer...
    Voila ^^
    Bonjour Aspic , j'avoue ne pas tres bien comprendre ta remarque, perso des que j'en ai la possibilite je mets des foreach, aussi bien pour lister que pour rechercher.
    Y aurait-il un mal a ca???

  10. #10
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par zeavan
    Bonjour Aspic , j'avoue ne pas tres bien comprendre ta remarque, perso des que j'en ai la possibilite je mets des foreach, aussi bien pour lister que pour rechercher.
    Y aurait-il un mal a ca???
    Bien sur que non il n'y a pas de probleme car le résultat est le meme !

    Mais tout dépens encre de ce que tu veux faire ! Je ne suis pas expert en la question mais à mon sens je privilégie les For Each pour rechercher un element dans un tableau et les For i as integer pour le reste...

    Mais bon on fait comme on veut !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 111
    Par défaut
    Citation Envoyé par Aspic
    tout dépens de ce que tu veux faire...

    Si tu veux lister quelque chose le mieux c'est le for i as integer...

    Si tu veux rechercher un element précis dans une collection, le mieux est d'utiliser un For Each...

    Voila ^^
    Bonsoir,

    Je ne comprends pas en quoi l'un est mieux que l'autre dans ce cas.
    Car si on recherche un élément, il faut commencer par lister les éléments de la collection non ?
    Si tu pouvais m'éclairer.

    edit : en y réfléchissant un peu plus : quand tu veux dire lister les éléments, tu entends lister des éléments de tous types et donc dans ce cas un For i= est préférable car on peut récupérer tous les types d'éléments, c'est bien ça ?
    Alors qu'avec un For each on ne peut récupérer que les éléments d'un seul type dans une collection qui ne doit contenir que des éléments de ce type, c'est donc à la fois restrictif mais aussi plus rapide si on n'a besoin que des éléments du même type.
    C'est-ce que tu as voulu dire ou je me trompe totalement ?

  12. #12
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Oui tu as bien compris c'est exactement ce que je pensais (je me suis peut etre mal exprimé )

    Et tu as donnée la réponse par tout meme... En effet si tu recherche qu'un type précis d'element utiliser le For Each me semble plus adequate.

    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    vous vous compliquez la vie si vous cherchez à gagner du temps sur la création d'une variable en mémoire ou une addition
    je vous rappelle que les processeurs ont quelques gigahertz de nos jours et qu'à moins que votre programme soit une calculatrice, il doit faire des choses plus complexes que ca

    il y a peu j'ai fait une fonction de traitement de chaine de caractères, je l'ai exécuté 500 fois dans une boucle et ca prenais moins de 5 millisecondes à executer ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    On se prends pas du tout la tete

    C'est juste une simple curiosité ! Mais à mon sens ca n'a aucune importance car c'est très très rapide ! (pas toujours )
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2014, 10h24
  2. performance for each
    Par robert_trudel dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/06/2008, 13h53
  3. apply-templates et for-each
    Par d'Oursse dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 14/05/2004, 08h38
  4. utilisation de for each
    Par billoum dans le forum ASP
    Réponses: 5
    Dernier message: 19/03/2004, 15h30
  5. [VB6] For Each ... In ...
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/02/2003, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo