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 :

Optimisation des ressources et Utilisation des collections


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Par défaut Optimisation des ressources et Utilisation des collections
    Bonjour à tous,

    je ne connais pas encore très bien le fonctionnement de la JVM et je voulais savoir si, lorsqu'on a une collection avec des objets dedans (mettons un ArrayList), s'il valait mieux la vider avec la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monArrayList.removeAll(monArrayList);
    Ou bien s'il valait mieux instancier un nouvel ArrayList et laisse faire le garbageCollector tout seul ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monArrayList = new ArrayList();
    De façon plus générale, vaut-il mieux vider le contenu d'un objet ou en instancier un nouveau et laisser le GarbageCollector faire ce qu'il a à faire ?


    Enfin, dernière question bonus, concernant la boucle for() pour traiter des tableaux ou des collections, y a-t-il une différence de performance entre la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0;i<tableau.length;i++)
       System.out.println(tab[i]);
    et la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(typeTableau temp : tableau)
       System.out.println(temp);

    Merci à tous pour vos réponse.
    PS: si vous avez de la doc sur ce genre de questions d'optimisation je suis preneur

  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
    Hello,

    Citation Envoyé par Gilles-Bettoud66 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monArrayList.removeAll(monArrayList);
    Ce n'est pas à ça que sert removeAll(). Utilise plutôt clear() pour vider une collection :

    Citation Envoyé par Gilles-Bettoud66 Voir le message
    De façon plus générale, vaut-il mieux vider le contenu d'un objet ou en instancier un nouveau et laisser le GarbageCollector faire ce qu'il a à faire ?
    C'est pareil. Dans tous les cas c'est le garbage collector qui s'en occupe de toute façon. Ce n'est pas quelque chose que tu peux changer.

    Il vaut mieux te concentrer sur ton idée de la chose : est-ce que tu penses plus à un nouvel objet vierge, ou est-ce que tu penses plus à vider l'objet que tu as, mais en gardant le même (si par exemple tu as passé cet objet à d'autres objets qui, eux en tout cas, vont garder le même ?) Sachant que dans ce deuxième cas, si tu as fait toi-même le code de vidage, tu risques d'avoir oublié des trucs à vider.

    Cas un peu complexe quand même : Dans le cas d'une ArrayList. Si par exemple à un moment de ton programme elle contient deux millions d'objets. Puis que tu la vides et que plus jamais elle ne contiendra plus de mille objets. Dans ce cas-là, en interne elle garde un tableau de taille deux millions, même si ce tableau est presque entièrement vide. Ce n'est probablement pas voulu puisque ça consomme de la place pour rien.

    Dans ce cas, il vaut mieux créer une nouvelle ArrayList, ou bien appeler trimToSize() dessus, pour redonner une taille raisonnable au tableau. Mais, il ne faut le faire que quand on sait que ça se justifie, sinon ça fait des redimensionnements coûteux pour rien.

    Citation Envoyé par Gilles-Bettoud66 Voir le message
    Enfin, dernière question bonus, concernant la boucle for() pour traiter des tableaux ou des collections, y a-t-il une différence de performance
    Oui. Tes collègues et toi serez beaucoup plus performants en écrivant et en lisant la deuxième syntaxe. C'est plus vite fait et plus facile à comprendre, ce qui donne des journées de travail plus productives.

    Ah, les performances d'exécution du programme tu voulais dire ? En général c'est pareil.

    Pour les tableaux, c'est pareil. Les deux syntaxes produisent le même exécutable après compilation.

    Pour les ArrayList c'est un peu la même chose. Différences sans importance qui produisent les mêmes performances.

    Pour les Set, ben la première syntaxe n'existe pas, donc, bah il te reste la seconde, hein .

    Pour les LinkedList, la première syntaxe ne doit pas être utilisée : elle n'est pas performante et n'est pas censée l'être. Il faut la seconde.

    Conclusion : le plus simple est de toujours utiliser la seconde, sauf lorsqu'on se rend compte que c'est impossible.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Par défaut
    Parfait ! Merci beaucoup Thelvin !

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Voir From Java code to Java heap, un article de Chris Bailey de chez IBM qui a inspiré sa présentation a la JavaOne 2012 plus tard cette même année. Choisir la bonne collection et surtout s'assurer qu'elle a la bonne capacité (!= taille) est en effet un problème qui peut s’avérer critique.

    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par Gilles-Bettoud66 Voir le message
    Enfin, dernière question bonus, concernant la boucle for() pour traiter des tableaux ou des collections, y a-t-il une différence de performance entre la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0;i<tableau.length;i++)
       System.out.println(tab[i]);
    et la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(typeTableau temp : tableau)
       System.out.println(temp);
    sauf erreur ou omission de ma part la seconde forme est quasiment une macro qui génère qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int i=0;i<tableau.length;i++) {
      typeTableau temp = tableau[i]
       System.out.println(temp);
    }
    donc le problème n'est pas lié au performances mais au fait que toute modification de "temp" ne sera pas répercuté dans le tableau si on lui affecte une valeur.
    d'où l'interêt d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(final typeTableau temp : tableau)
       System.out.println(temp);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/05/2014, 15h19
  2. Mauvaise utilisation des ressources [DATAWARE HOUSE]
    Par bvincent dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/06/2007, 12h28
  3. Utilisation des ressources ou de fonctions ?
    Par Claude URBAN dans le forum Windows
    Réponses: 4
    Dernier message: 14/01/2007, 20h57
  4. Utilisation des ressources
    Par jojoboloss dans le forum Access
    Réponses: 1
    Dernier message: 23/04/2006, 16h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 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