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 :

Déclaration de variable et garbage collector


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut Déclaration de variable et garbage collector
    Bonjour à tous,

    Je me posais une question toute simple. J'ai pris l'habitude d'écrire le code suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MonObjet objet;
    for(//une boucle) {
     objet = new MonObjet();
     list.add(objet);
    }

    plutôt que

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(//une boucle) {
     MonObjet objet = new MonObjet();
     list.add(objet);
    }

    parce que j'avais l'impression que faire une seule déclaration simplifiait le travail du garbage collector. Est-ce le cas ? Parce que je me rends compte que mon code est moins lisible, et que la variable ainsi déclarée est accessible en dehors de la boucle, ce qui est bof...

    Quelqu'un sait comment le garbage collector .Net fonctionne ?

    (au passage, je me pose la même question pour JAVA, si ya des connaisseurs...)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    parce que j'avais l'impression que faire une seule déclaration simplifiait le travail du garbage collector. Est-ce le cas ?
    Non, ça ne change rien pour le garbage collector. Le GC ne s'occupe pas des variables déclarées, seulement des instances d'objets.

    Citation Envoyé par Flaburgan Voir le message
    Parce que je me rends compte que mon code est moins lisible, et que la variable ainsi déclarée est accessible en dehors de la boucle, ce qui est bof...
    Effectivement c'est moins clair, et il est généralement recommandé de déclarer les variables le plus près possible de leur utilisation.

    Citation Envoyé par Flaburgan Voir le message
    Quelqu'un sait comment le garbage collector .Net fonctionne ?
    Euh, à peu près, mais c'est un peu vague comme question... c'est un vaste sujet.

    En gros, le GC garde la trace des objets qui sont accessibles (car référencés par des objets accessibles). Quand un objet n'est plus accessible, il devient éligible au "ramassage" (garbage collection). Son finaliseur (destructeur) est exécuté s'il existe, et la mémoire utilisée par l'objet est libérée.

    Citation Envoyé par Flaburgan Voir le message
    (au passage, je me pose la même question pour JAVA, si ya des connaisseurs...)
    Pose la question dans le forum Java alors

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    En fait, pour moi, ça aurait pu influencé le GC dans ce sens :
    A chaque boucle, puisque j'ai une nouvelle déclaration, j'ai un nouvel espace mémoire réservé. J'ai un new qui est fait donc je place dans cet espace mémoire un nouveau pointeur vers mon nouvel objet. Le tour d'après, rebelote, donc mon ancien objet ET mon ancien espace déclaré doivent être supprimé.

    Alors qu'avec le premier code, d'après mon interprétation, ça gardait l'espace mémoire pour le pointeur, et ça aidait le GC à voir que l'ancien objet n'était plus utilisé puisque j'effaçais l'ancien pointeur.

    (en l'occurrence, je suis en train de me dire que puisque le l'ajoute à une liste, l'objet est bien toujours utilisé...)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    A chaque boucle, puisque j'ai une nouvelle déclaration, j'ai un nouvel espace mémoire réservé.
    Non, c'est le même espace sur la pile qui est réutilisé. Il y a seulement une allocation de taille fixe, et comme c'est sur la pile le GC ne s'en occupe pas

    Citation Envoyé par Flaburgan Voir le message
    J'ai un new qui est fait donc je place dans cet espace mémoire un nouveau pointeur vers mon nouvel objet. Le tour d'après, rebelote, donc mon ancien objet ET mon ancien espace déclaré doivent être supprimé.
    L'ancien objet n'est pas supprimé, puisqu'il est toujours référencé par la liste. Et l'espace déclaré n'est libéré que quand tu sors de la méthode, mais de toutes façons la gestion de la pile n'est pas le travail du GC...

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Les deux codes produisent exactement la même séquence IL (bytecode).
    Donc aucune différence. De toute façon, en IL, les emplacements des variables locales sont tous déclarés dans l'en-tête de la fonction.

    Effectivement c'est moins clair, et il est généralement recommandé de déclarer les variables le plus près possible de leur utilisation.
    Parce que cela permet dans certains au compilateur de réutiliser le même emplacement pour deux variables différentes (exemple : deux boucles for qui se suivent - pas imbriquées - chacune avec leur propre variable d'incrémentation de type int, le compilateur fusionnera les deux variables en une seule).

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Parce que cela permet dans certains au compilateur de réutiliser le même emplacement pour deux variables différentes (exemple : deux boucles for qui se suivent - pas imbriquées - chacune avec leur propre variable d'incrémentation de type int, le compilateur fusionnera les deux variables en une seule).
    Ah, je connaissais pas cette optimisation... Mais de toutes façons, la meilleure lisibilité est déjà une raison suffisante pour suivre cette règle

  7. #7
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonsoir,

    A ma connaissance, il n'y a quasiment aucune différence, sauf comme tu dis que ta variable a un scope différent, elle est visible à l'extérieur de la boucle (pas vraiment intéressant quand on n'a pas vraiment besoin de cette variable plus bas) et que fondamentalement parlant, il y a allocation d'un pointeur à chaque itération de ta boucle mais si tu as coché la case optimiser le code dans les propriétés de ton projet, peut-être que le compilateur simplifiera et fera en sorte que ce pointeur soit réutilisé (enfin je ne mise jamais sur les optimisations que pourrais faire le compilateur C#).

    Pour pousser un peu mémé dans les orties (j'adore cette expression )
    tu pourrais écrire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (i=0;i<nombreInstances;i++)
        maListe.Add(new MonObjet());
    Personnellement, je fais comme ça parce qu'il n'y a aucun intérêt à définir une variable intermédiaire alors que tu pourrais t'en passer.
    Je sais que je chipote et que la différence en performances n'est pas énorme, mais c'est plus joli

    Bon dév à tous

  8. #8
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par sisqo60 Voir le message
    A ma connaissance, il n'y a quasiment aucune différence, sauf comme tu dis que ta variable a un scope différent, elle est visible à l'extérieur de la boucle (pas vraiment intéressant quand on n'a pas vraiment besoin de cette variable plus bas) et que fondamentalement parlant, il y a allocation d'un pointeur à chaque itération de ta boucle
    Pas tout à fait, il y a simplement réinitialisation de la variable à zéro (null) quand celle-ci a été déclarée à l'intérieur de la boucle (puisque toute allocation de variable implique mise à zéro).

    Mais c'était bien vu tout de même et je confirme que le JIT optimise ça, donc pas de différence au final.

    il n'y a aucun intérêt à définir une variable intermédiaire alors que tu pourrais t'en passer. Je sais que je chipote et que la différence en performances n'est pas énorme, mais c'est plus joli
    La différence est là aussi nulle à mon avis, c'est typiquement le genre de choses optimisées, même si ce n'est qu'une supposition. Les variables locales n'existant pas en asm, le compilo profite généralement de la conversion en asm pour faire un peu de ménage.

  9. #9
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Oui, il faut penser qu'en IL beaucoup de code que l'on trouve plus lisible ou non donnera la même chose. de mémoire toutes les boucles deviennent un while, etc.

    La question de la lisibilité reste surtout un point important pour le développeur.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par kheironn Voir le message
    de mémoire toutes les boucles deviennent un while, etc.
    Bah toutes les boucles deviennent des "goto" en fait (enfin des "branch" conditionnels pour être exact)

  11. #11
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bah toutes les boucles deviennent des "goto" en fait (enfin des "branch" conditionnels pour être exact)
    C'était un "de mémoire"... aloïse se rapproche !

    Enfin tout ça pour dire, que l'on code plus pour nos petits yeux que pour la machine qui fait sa tambouille toute seule.

Discussions similaires

  1. Variable globale ou locale et garbage collector
    Par Battant dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 27/07/2014, 11h53
  2. Variable static et garbage collector
    Par obelix dans le forum Langage
    Réponses: 2
    Dernier message: 24/05/2007, 11h00
  3. déclaration de variables de 16, 32 et 128 bits
    Par samipate dans le forum C++
    Réponses: 10
    Dernier message: 30/12/2004, 22h33
  4. [FLASH MX2004] Déclaration de variables sous flash mx
    Par softyClochette dans le forum Flash
    Réponses: 4
    Dernier message: 29/11/2004, 16h11
  5. [debutant][Portée] Déclaration de variable .....
    Par Slein dans le forum Langage
    Réponses: 4
    Dernier message: 07/05/2004, 10h43

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