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 :

Optimisation de déclaration


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut Optimisation de déclaration
    Bonjour,

    Qu'est ce qui est le plus propre, et le plus optimisé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MyClass a;
    foreach elt in mylist
    {
    //Traitements divers
    a = new MyClass(elt.Id)
    //Traitements divers
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach elt in mylist
    {
    //Traitements divers
    MyClass a = new MyClass(elt.Id)
    //Traitements divers
    }
    Merci.

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Je dirais que c'est l'option 1, car elle ne crée qu'un objet, alors que la seconde en créera autant qu'il y aura de passage dans la boucle D'ailleurs, si tu cherches à améliorer ce genre de points dans ton code, l'outil FxCop est d'une très grande aide (tutoriel de Ronald Vasseur ici)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    Citation Envoyé par eusebe19 Voir le message
    Salut.

    Je dirais que c'est l'option 1, car elle ne crée qu'un objet, alors que la seconde en créera autant qu'il y aura de passage dans la boucle D'ailleurs, si tu cherches à améliorer ce genre de points dans ton code, l'outil FxCop est d'une très grande aide (tutoriel de Ronald Vasseur ici)
    Les deux codes créent autant d'objet (dans les deux cas il y a un new dans la boucle, donc dans les deux cas on instancie un objet à chaque itération).

    Du coup, le deuxième est beaucoup plus propre car limite la portée de la variable. Dans le premier code, la dernière instance de MyClass est toujours accessible via la référence "a" après la sortie de la boucle, ce qui peut être trompeur.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Bonjour,

    Il y a effectivement création et destruction de quelquechose à chaque tour de boucle dans l'option 2, c'est la place pour une référence vers un objet de type MyClass soit un long (4 octets).
    Pour ce qui est des objets créés, comme c'est le garbage collector qui les détruit ils sont détruit maintenant ou détruits plus tard.

    Maintenant, la question que je me pose c'est qu'en est-il si la class MaClass est de type valeur (une sous classe de struct) ?
    Le système alloue t'il la place pour une référence ou alors un objet complet (ce qui peut faire beaucoup de place) ?
    S'il alloue un objet complet, utilise t'il le constructeur par defaut de l'objet ?

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    je pense que certains font fausse route

    à chaque toue une instance est créée, une instance = un pointeur (64bits = 8 octets, pas 4) + les données de la classes

    ensuite si la variable est déclarée avant le for, elle va stocker le pointeur, puis stocker un autre pointeur etc...

    si la variable est déclarée pendant le for, elle va stocker le pointeur, puis être mise à null, puis recréée, restocker un pointeur etc...
    (sortie de portée = mise à null)

    donc en théorie déclarer la variable avant la boucle devrait permettre de gagner un peu de temps, les instances lachées dans la nature sont mises à null aussi mais par le garbage collector donc de manière asynchrone
    alors qu'avec une déclaration interne à la boucle, la portée est limitée et permet de sécuriser le code, on est sur de pas utiliser trop de variables à un instant T

    mais en fait, le compilateur va compiler, et donc le code final ne ressemblera pas à ca, et il y a de forte chance pour que les 2 codes se retrouvent compilés de la même manière
    dans ce cas, la solution de limiter la portée est en théorie mieux
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Bonjour,
    C'est de la micro optimisation, ça ne sert à rien, applique plutôt le principe de limitation de la portée de tes variables, comme dans ton deuxième exemple.
    Cordialement.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Je ne suis pas d'accord avec nicolas.sitbon (mais peut etre ai je tord)

    C'est vrai que tout dépend du nombre de passage dans la boucle, mais personnellement, j'ai toujours pour principe que l'on ne sait pas comment ca va évoluer, inutile de fatiguer le proc à fabriquer puis détruire n fois un objet.

    Pour l'anedote, j'ai le souvenir d'une methode qui comme cela passait de 5 minutes de traitement à 15 secondes... le tout à coup de micro optimisations.

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. [Optimisation?] Déclaration de variable dans les boucles
    Par romaintaz dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2006, 16h08
  3. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24
  4. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  5. Réponses: 8
    Dernier message: 17/05/2002, 09h08

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