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 :

Instanciation d'un objet en dehors d'une boucle vs à l'intérieur


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut Instanciation d'un objet en dehors d'une boucle vs à l'intérieur
    Bonjour,

    J'ai une question concernant les performances liées à la déclaration et l'instanciation des objets.
    Je me demande si la déclaration d'un objet à chaque cycle de boucle est une bonne solution ou le contraire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    String str;
    		for (int i = 0; i < 10000000; i++) {
    			str = new String("Bonjour");
    		}
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		for (int i = 0; i < 10000000; i++) {
    			 String str = new String("Bonjour");
    		}
    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Déclarer un objet n'effectue rien du tout. Seule son affectation (str = quelquechose;) fait quelque chose.

    Décider où on fait la déclaration est une question de propreté du code, pas de vitesse d'exécution. L'exécution sera la même.

    Et donc, pour la propreté du code, les variables doivent être déclarées le plus tard possible.

    (Bon, par contre, instancier avec new une nouvelle String de même valeur que les précédentes à chaque boucle, ça c'est très mauvais question performances.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    concernant l'objet String, c'est juste un exemple. Ce que j'ai voulu savoir, est ce que la déclaration à l'intérieur de la boucle n'a pas d'effet sur la pile.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ma foi, je vais vérifier, mais il n'y a pas de raison que ça fasse une différence. Et le boulot du compilateur, c'est de s'en rendre compte et faire au mieux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ando0098 Voir le message
    concernant l'objet String, c'est juste un exemple. Ce que j'ai voulu savoir, est ce que la déclaration à l'intérieur de la boucle n'a pas d'effet sur la pile.
    Tu peux vérifier cela en décompilant le code avec javap -c : le bytecode généré est identique (ou presque, puisque ne change que les index des variables).


    Ce genre de truc c'est de l'optimisation de bout de chandelle...
    Déjà avant de chercher à optimiser il faudrait cibler le problème. Sinon ce n'est que pur perte de temps source de problème potentielle à cause d'optimisation bidon !


    Comme le dis thelvin le principal reste la lisibilité et la cohérence du code.Donc si la variable n'est utilisé que dans la boucle, autant la déclarée dedans...

    A moins bien sûr que ce soit une constante dont la valeur est identique pendant toute la boucle.


    a++

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Bonsoir,

    Question de débutant : ce genre de boucle n'alloue-t-il pas 10000000 d'emplacements pour un objet de type String ?

    Si oui quel est l'intérêt ? Car en plus je suppose qu'on obtient uniquement une référence pour le dernier emplacement, non ?

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Question de débutant : ce genre de boucle n'alloue-t-il pas 10000000 d'emplacements pour un objet de type String ?
    Ça instancie 10000000 objets String, mais vu que la référence vers chacun d'eux est perdue à la fin de la boucle, il devient immédiatement garbage-collectable et il n'est pas nécessaire de les garder tous en même temps.
    A priori, donc, on ne peut pas dire que ça "alloue 10000000 emplacements".

    Citation Envoyé par Beginner. Voir le message
    Si oui quel est l'intérêt ?
    Comme l'a dit ando0098, cet exemple n'a pas d'intérêt. Il veut simplement savoir si, pour l'exécution, il vaut mieux déclarer une variable objet qui sera écrasée à chaque boucle, à l'intérieur ou à l'extérieur de cette boucle.

    Et la réponse est que ça n'a pas d'importance pour l'exécution, mais qu'il est plus propre pour le code, de la déclarer à l'intérieur.

    Citation Envoyé par Beginner. Voir le message
    Car en plus je suppose qu'on obtient uniquement une référence pour le dernier emplacement, non ?
    Je sais pas trop ce que tu veux dire, mais à la fin de la boucle, il ne reste de référence que vers la dernière String créée, oui. Et encore, ça c'est si la String est déclarée à l'extérieur de la boucle. Si elle l'est à l'intérieur, plus aucune de ces String n'est atteignable après la boucle. Elles sont toutes garbage-collectables, même la dernière.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 12
    Dernier message: 16/11/2011, 17h41
  2. [MySQL] For each en dehors d'une boucle mysql
    Par Jeol2007 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/08/2010, 07h45
  3. affichage d'un objet uicontrol texte dans une boucle
    Par oliv27400 dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 25/08/2010, 14h35
  4. Réponses: 8
    Dernier message: 09/09/2008, 16h19
  5. [POO] imposer une instanciation d'un objet
    Par zenzo dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2006, 02h08

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