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 :

Recyclage d'objets, performances


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Recyclage d'objets, performances
    Je vais me lancer dans la conception d'un programme qui utilise plusieurs dizaines d'objets à la secondes.
    Comme il devra fonctionner aussi bien sur PC que sur Android, j'ai besoin de très bonnes performances.

    Plutôt que de créer les objets, j'ai lu qu'il était préférable de les "recycler".
    C'est à dire que quand un objet n'est plus utiles, on le marque comme "à recycler", et on peut s'en resservir éventuellement plus tard (en y mettant de nouvelles informations).

    Existe t-il quelque chose de prévu pour ça dans Java ?

    Merci

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    Je ne pense pas qu'il y est quelque chose de prévu en java pour ça !
    C'est à toi de prévoir le recyclage des objets.

    Un très bon exemple de recyclage est celui des connexions JDBC grâce au pool de connexion.

    Le principe est très simple : tu demandes une connexion au pool, s'il n'a pas de connexion dispo il en créé une sinon il t'en retourne une (déjà créé). Une fois le traitement terminé tu libères la connexion.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    Heu...

    En même temps c'est un peu ce que fais le GC : il réserve de la mémoire pour les futurs objets...

    a++

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    ce genre de processus ne sera utile que si la création des objets et couteuse (connection à une base de donnée par exemple)

    Pour le recyclage (et le pool) d'objet baisque, ca avait été tenté avec les EJB 2 en java. C'était extrèmement lourd et chiant à utiliser et le gain de performance n'a jamais été démontré. Entre remettre à zéro manuellement tous les champs d'un objet ou faire un new , je préfère la deuxième option. La jvm est capable de faire des centaines de new par seconde sans que tu t'en rende compte.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ce genre de processus ne sera utile que si la création des objets et couteuse (connection à une base de donnée par exemple)

    Pour le recyclage (et le pool) d'objet baisque, ca avait été tenté avec les EJB 2 en java. C'était extrèmement lourd et chiant à utiliser et le gain de performance n'a jamais été démontré. Entre remettre à zéro manuellement tous les champs d'un objet ou faire un new , je préfère la deuxième option. La jvm est capable de faire des centaines de new par seconde sans que tu t'en rende compte.
    Ha ?

    J'avais fait une première version de mon logiciel n'utilisant pas le recyclage.
    Je n'ai pas de problèmes de performances particuliers, mais je souhaite quand même le rendre le plus léger possible (Android oblige).

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    allouer / désallouer n'est pas si lourd que ca en java. Comme l'a dit adiguba, l'allocation "par bloc" est déjà gérée par la jvm. Quand tu fais un new, il va simplement localiser et "remettre à zéro" une zone mémoire qui lui appartiens déjà, dans la plus part des cas. Un code de recyclage aura plutot le problème inverse c'est qu'il va garder en mémoire plus que nécesaire, ce qui pourrait forcer la jvm à faire des allocations de mémoire supplémentaire inutiles.

    As-tu déjà passé un profiler sur ton code pour prouver que l'allocation est un bottleneck? Passer son temps à optimiser un bout de code sans avoir, au préalable, la preuve que c'est lui qui consomme le plus de ressources et une perte de temps inutile. C'est un peut comme vouloir optimiser à tout prix l'injection dans un moteur à explosion pour accélérer la voiture et ne pas se rendre compte que depuis 2 ans on roule avec le frein à main serré

    Les profilers existent, utilise les.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Heu...

    En même temps c'est un peu ce que fais le GC : il réserve de la mémoire pour les futurs objets...

    a++
    Oui ça je sait !
    Sauf que ça prend un certain temps d'allouer de la mémoire.
    Ce temps est minime la plupart du temps.
    Mais dans mon cas, je vais avoir des dizaines d'objets par seconde.
    Et c'est susceptible de tourner sur un téléphone Android.

    ok pour le pool de connexion, je vais justement avoir un système un peu similaire.

    je pense faire plusieurs choses :
    - un constructeur privé sans paramètre
    - une méthode getInstance prenant en paramètre ce que l'on fournit généralement à un constructeur
    - une méthode recycle, s'occupant de recycler l'objet

    Je pense aussi utiliser un tableau static contenant les objets "recyclés".

    Je vois comment faire le mécanisme, le seul problème, c'est que j'en ai besoin dans plusieurs classes.
    Ces classes héritent d'une classe commune, mais je ne vois pas trop comment faire pour hériter de ce système qui est essentiellement "static".

  8. #8
    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
    Citation Envoyé par PierreD87 Voir le message
    Sauf que ça prend un certain temps d'allouer de la mémoire.
    En Java un new n'est pas synonyme d'allocation mémoire ! Le GC alloue la mémoire par bloc


    Je pense qu'il serait plus intéressant de connaitre la manière dont tu utilises tes objets...

    a++

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    En Java un new n'est pas synonyme d'allocation mémoire ! Le GC alloue la mémoire par bloc


    Je pense qu'il serait plus intéressant de connaitre la manière dont tu utilises tes objets...

    a++
    ça me sert à décrire un évènement de type interface utilisateur :
    - souris
    - clavier

Discussions similaires

  1. [Performance] Gestion des objets ?
    Par rad_hass dans le forum ASP.NET
    Réponses: 5
    Dernier message: 15/10/2008, 17h17
  2. Performances avec des listes d'objets
    Par metalcoyote dans le forum Langage
    Réponses: 9
    Dernier message: 20/05/2008, 12h11
  3. Mapping Objet/Relationnel : optimisez les performances ?
    Par voyageur dans le forum Optimisations
    Réponses: 10
    Dernier message: 12/06/2007, 16h51
  4. Réponses: 2
    Dernier message: 30/05/2006, 16h26
  5. [Language][Objets en Paramètres]Performances?
    Par Regis.C dans le forum Langage
    Réponses: 4
    Dernier message: 11/09/2005, 14h16

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