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

Langage Java Discussion :

get().get().get().. et performance de la pile ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Par défaut get().get().get().. et performance de la pile ?
    Bonjour,

    j'ai une petite question concernant une codage simple mais pouvant soulever des questions :

    Prenons par exemple la classe Conteneur :

    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
    public class Conteneur {
        private String toto = "ma valeur";
        private String truc = "un super truc";
        private int quaranteDeux = 42;
        ..autres membres...
     
        public String getToto() {
            return toto;
        }
     
        public int getQuaranteDeux() {
            return quaranteDeux;
        }
     
        public String getTruc() {
            return truc;
        }
     
        ...autre getters...
    }
    Maintenant imaginons une deuxième et troisème classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Fils {
        private Conteneur plop = ...;
     
        public Conteneur getPlop() {
            return plop;
        }
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Pere {
        private Fils monFils = ....;
     
        public Fils getMonFils() {
            return monFils;
        }   
    }
    Maintenant imaginons que j'ai besoin des valeurs des membres de Conteneur pour en faire "quelque chose"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void faireQqChose(String toto, String truc, int quaranteDeux) {...}
    Voici le problème : en imaginant que mes classes Pere, Fils et Conteneur "pèsent" en mémoire plus que juste ce que je viens de faire, et que les getters de chaque classe soient tels quels : càd ne prenant pratiquement pas de temps d'execution (par rapport par exemple à un getter qui irait chercher la valeur par ftp ou n'importe quelle autre méthode qui peut être nettement plus chronophage).

    Comment appeler l'execution de "faireQqChose" ?

    Méthode 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    faireQqChose(getMonFils().getPlop().getToto(), getMonFils().getPlop().getTruc(), getMonFils().getPlop().getQuaranteDeux());
    Méthode 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Conteneur tmpPlop = getMonFils().getPlop();
    faireQqChose(tmpPlop.getToto(), tmpPlop.getTruc(), tmpPlop.getQuaranteDeux());

    Mon problème : es-ce que c'est plus optimisé de passer par un tmpPlop ou es-ce que le compilateur va mieux optimiser les get().get() à répétitions ?


    Voici, c'est tout bête, mais j'ai tendance à utiliser la méthode 1 (des fois avec beaucoup plus d'intermédiaires) et les longues ne me gènent pas (ce n'est pas le problème de cette question) et peut être que finalement pour l'execution il vaux mieux utiliser la méthode 2.

    Attention, l'aspect lisibilité du code ne m'interesse pas, seul les performance sont à étudier.

    Autre chose : je sais que si j'avais à le coder en C++ je pense que je choisirais la méthode 2, pour des problèmes de taille de pile (limité), mais je suis un mauvais développeur C++.

    As-t-on les mêmes problèmes pour le pile en java ?


    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Personellement, j'utilise la méthode 1, sauf quand, j'ai beaucoup de fois le même bond à faire, alors j'opte pour la deux, question de vitesse d'écriture. J'ai plus rapide d'écrire 5 fois plop.xxxx que d'écrire 5 fois machin.getTruc().getPlop().xxxx, et c'est plus lisible. En ce qui concerne les temps d'accès, à mois que tu doive absolument optimiser ta méthode (genre truc critique utilise 3000 fois par seconde), même si le compilo n'optimise pas méthode 1, je ne vois pas de grosse perte de temps.


    le problème, c'est le GC. Dans ta méthode 2 tu rajoute une référence sur l'objet intermédiaire, faut penser à la remettre à null, sauf si tu compte sortir vite de ton contexte actuel.Exemple où ce serait pas recommandé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public boolean methodeLongue(Machin m){
    Plop p = m.getTruc().getBidule().getPlop();
    Truc t = uneMethode(p,p.getX(), p.getY());
    m.setTruc(t); // maintenant p est peut etre la seule référence restante à cet ancien Plop
    while(tresLongtemps)
       faireDesTruc();
    }
    p devra attendre longtemps pour etre garbage collecté. Si il référence indirectement beaucoup de données devenue inutile, tu empeche le GC de pouvoir les nettoyer tout de suite (il devra attendre la fin de la méthode)

Discussions similaires

  1. gets() a la suite de scanf() -> probleme
    Par ickis dans le forum C
    Réponses: 12
    Dernier message: 14/12/2003, 20h24
  2. gets ,fgets
    Par Zazeglu dans le forum C
    Réponses: 2
    Dernier message: 19/09/2003, 18h24
  3. Créer les get et set des classes
    Par cameleon2002 dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/09/2003, 21h03
  4. url d'une page asp ou upload avec get
    Par taupin dans le forum ASP
    Réponses: 18
    Dernier message: 22/08/2003, 14h25

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