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

C# Discussion :

Boucles for et tableau


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Par défaut Boucles for et tableau
    Salut à tous, je voulais savoir quels étaient la manière la plus rapide de parcourir un tableau avec une boucle for après avoir lu les tests de rapidité fait en C# (framework 3.0) sur le magazine developpez de ce mois ! J'ai donc fais ceci en c# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
                int[] tab                   = new int[229948364];
                Random rand                 = new Random();
                Stopwatch stopWatchEn       = new Stopwatch();
                Stopwatch stopWatchTab      = new Stopwatch();
                Stopwatch stopWatchTabLen   = new Stopwatch();
                int lgTab           = 0;
     
                //Une première initialisation du tableau pour le charger en mémoire
                for (int j = 0; j < tab.Length; j++)
                {
                    tab[j] = 0;
                }
     
                //Différentes boucles for pour tester
                for (int h = 0; h < 25; h++)
                {
                    stopWatchTab.Start();
                    lgTab = tab.Length;
                    for (int j = 0; j < lgTab; j++)//Premier type de boucle : utilisation d'une variable chargé avec la taille du tableau
                    {
                        tab[j] = 5;
                    }
                    stopWatchTab.Stop();
     
                    stopWatchTabLen.Start();
                    for (int i = 0; i < tab.Length; i++)//Second type : utilisation à chaque tour de la taille "calculée" du tableau
    			    {
                        tab[i] = 5;
    			    }
                    stopWatchTabLen.Stop();
     
                    stopWatchEn.Start();
                    for (int j = 0; j < 229948364; j++)//Troisième type : utilisation directe d'un entier correspondant à la taille du tableau
                    {
                        tab[j] = 5;
                    }
                    stopWatchEn.Stop();
                }
                stopWatchEn.Stop();
                stopWatchTab.Stop();
                stopWatchTabLen.Stop();
     
                //Résultats
                Console.WriteLine("Voici le résultat des tests :");
                Console.WriteLine("Entier : "    + stopWatchEn.Elapsed.Milliseconds);
                Console.WriteLine("Tab : "       + stopWatchTab.Elapsed.Milliseconds);
                Console.WriteLine("TabLength : " + stopWatchTabLen.Elapsed.Milliseconds);
            }
    Voici le résultat de 6 tests réalisés :

    Entier : 637
    Tab : 131
    TabLength : 230

    Entier : 779
    Tab : 361
    TabLength : 715

    Entier : 550
    Tab : 66
    TabLength : 991

    Entier : 343
    Tab : 989
    TabLength : 3

    Entier : 319
    Tab : 39
    TabLength : 20

    Entier : 332
    Tab : 32
    TabLength : 11

    Voici le résultat des 6 tests additionnés :

    Entier : 2960
    Tab : 1618
    TabLeng : 1970

    Pourquoi tant de différence entre les deux premiers ? (qui pour moi sont quasi pareils...)
    Pourquoi le tablength est il aussi rapide ? (le framework recalcule t'il à chaque tour la taille ou est elle stockée ?)

    Les sources sont disponibles ici pour tester : http://hugobosscool26.free.fr/TestBoucleFor.rar


    Merci de vos réponses

    PS : si vous avez des liens sur l'optimisation d'algorithme je suis preneur.
    PS2 : y en a t'il qui ont VS2K8 (& framework 3.5) pour voir le code source de tab.Length ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Pour le code source, comme toujours, Reflector est la (pour les malchanceux n'ayant pas VS2008 ou une express =p).

    Pour la difference entre entier fixe et local, j'avouerai que je ne sais pas trop, par contre pour le tab.Length, la taille d'un tableau est une instruction IL (ldlen, l'appel à length d'un array etant un appel interne à la CLR (cf reflector)), et doit, donc, etre optimisé (bon ca n'avance pas beaucoup de dire ca, mais je pense que c'est la seule explication logique =p).

    Par contre chose etonnante, le fait de compile avec optimize, rend les differences de performances bien moins marquées (le passage sur int fixe est amelioré, et le passage par Length est plus lent).

    Bref, le mystere s'epaissit ! =)

    Dans un usage pratique, le Length s'avere etre la meilleure solution, donc utilise le. =)

  3. #3
    Membre confirmé
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Par défaut
    Ben oui tout ca est bizarre pour moi si d'autres pouvaient apporter leur culture !

  4. #4
    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
    Le JIT recherche (et optimise) les patterns dans le code correspondant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int j = 0; j < tab.Length; j++)
    C'est la raison pour laquelle ces codes s'éxécutent plus rapidement. Je n'ai plus l'optimisation exacte, et ce ne serait pas vraiment utile ici. L'idée est de savoir que ce pattern est traité spécifiquement par le JIT.
    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

  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
    Ah si j'ai retrouvé, l'optimisation est de supprimer des tests de bornes du tableau car on utilise directement Length. C'est la raison pour laquelle cette optimisation n'est pas appliquée quand la taille est stockée dans une variable annexe.

    EDIT : Et pour ceux qui pourraient être intéressés, j'ai trouvé ceci :
    http://weblogs.asp.net/justin_rogers.../26/97230.aspx

    Plus général :
    http://dotnet.sys-con.com/read/46342.htm
    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 confirmé
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Par défaut
    Merci SaumonAgile, je regarderais cela avec attention dès que j'ai le temps

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Enfin moi ce qu'il m'étonne c'est que pour tablength on va de 3 à 991 ms.
    Soit une moyenne qui devrait se trouver à 494 mais on observe 328.

    Je pense que tes résultats ne peuvent être pris en compte que si tu fais une étude statistique sur une 100 de tests.

    Par ce que là tu dois avoir un epsilon erreur trop grand pour que les données soit utilisable.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Tant qu'à faire : en principe un "down to 0" est plus rapide qu'un "up to x", tu pourrais tester s'il te plait?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for( int i = tab.Lenght; i > 0; --i )
    { 
    ...
    }
    Merci

  9. #9
    Membre confirmé
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Par défaut
    Fais toi plaisir Chubyone fais-le

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Citation Envoyé par hugobosscool26 Voir le message
    Fais toi plaisir Chubyone fais-le
    Ok j'avoue, Là... C'était total loose flemme... Mais j'avais du pain sur la planche, c'était juste au càs où tu passais par là, j'aurais eu réponse

    Mais c'était aussi une simple remarque pour toi, qui pouvait t'amener à tester et donc choisir ensuite la meilleure technique

    Bon aller ok, je prendrais tes exemples et je testerais ça demain, j'ai du temps maintenant...

Discussions similaires

  1. [FPDF] Boucle for pour tableau.
    Par Thibcal dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 19/01/2015, 11h57
  2. [XL-2007] Boucle for sur Tableau volumineux
    Par meolimo dans le forum Excel
    Réponses: 6
    Dernier message: 14/11/2014, 15h46
  3. Probleme VBS et boucle For each + tableau
    Par fas3r dans le forum Windows
    Réponses: 0
    Dernier message: 26/02/2008, 03h00
  4. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  5. boucle for n fois pour n tableau...
    Par toyyo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/08/2005, 16h01

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