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

avec Java Discussion :

Façon optimale pour créér un objet en Java


Sujet :

avec Java

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut Façon optimale pour créér un objet en Java
    Bonjour,

    je suis en train d'essayer d'accélérer une application web JEE. Comme souvent, on extrait des données d'une base et ensuite on stocke les objets (et souvent beaucoup) resultatnts dans les collections.
    Il existe en java plusieurs façon de créér des objets:

    *) new MonObjet();
    *) (MonObjet) Class.forName("PackageName.ClassName").newInstance();
    *) utilisation de la méthode clone (pour les objets implementant Cloneable)
    *) via une Factory, spring, ..;
    *) etc...

    J'ai fait des tests avec des objets de type Calendar et dans ce cas, la création des objets via clone() a été beaucoup plus rapide (facteur 15 ) que par la méthode Calendar.getInstance();

    En revanche, sur une objet de type Personne avec juste deux attributs nom et prenom, la méthode classique (new Personne(nom,prenom) )a donné des temps de traitement beaucoup plus rapides qu'avec .clone(). (3 flois plus lent)

    Je suis surpris de l'inversion des vitesses de traitements et je ne comprend pas d'où viens cette inversion. Si quelqu'un a une explication?

    De façon plus générale, quelle est la méthode qui permet d'instancier une collection d'objet le plus rapidement et pourquoi (différence par rapport aux autres méthodes) ?

    Est-ce que la méthode la plus rapide dépend des caractéristiques des objets instanciés? Si oui, quels sont les critères influants?

    merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Calendar.getInstance() fait bien plus de choses qu'un simple new... Mais là n'est pas la question, au fond.

    Citation Envoyé par plawyx Voir le message
    Est-ce que la méthode la plus rapide dépend des caractéristiques des objets instanciés?
    Oui, bien évidemment.

    C'est comme si tu demandais s'il vaut mieux cuire au four, à la poêle, au micro-onde.... Ben ça dépend, tu vas cuisiner quoi ?

    Citation Envoyé par plawyx Voir le message
    Si oui, quels sont les critères influants?
    Essentiellement, qu'est-ce qui se passe dans le constructeur, qu'est-ce qui se passe dans le clone(), qu'est-ce qui se passe dans la factory, (et qu'est-ce qui se passe dans les autres manières d'obtenir une instance.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par thelvin Voir le message

    Oui, bien évidemment.

    C'est comme si tu demandais s'il vaut mieux cuire au four, à la poêle, au micro-onde.... Ben ça dépend, tu vas cuisiner quoi ?
    Je précise: selon le type des attributs de l'objet à instancier et en ayant une idée de la complexité du traitement dans le constructeur, je cherche une "règle" qui permet de te guider sur le choix de la méthode d'instanciation pour un gain de traitement en fonction des caractéristiques de ton objet. Comme le test que j'ai fait avec l'objet Personne et deux attributs String qui me donne une instanciation avec "new" 3 fois plus rapide qu'en utilisant clone(): pourquoi? est-ce toujours le cas avec des attributs String ou primitifs en général? Est-ce que clone() serait plus rapide avec des attributs collection, ou objet en général ?

    Si quelque soit la complexité de l'objet et du constructeur, l'instanciation "new" est toujours plus rapide que clone(), l'intérêt de la méthode clone() est plus que réduit. Est-ce la même conclusion avec class.forName() par exemple? Est-ce que ces différentes reposent sur l'instanciation par "new" et ont été introduites que pour des facilités d'écriture du code, au quel cas, si on cherche à accélérer un peu le processus d'instanciation, on utiliserait que "new" dans tous les cas.


    Ou alors (sans avoir à renter en détail dans le fonctionnement de la jvm), la seule technique est peut-être empirique à savoir d'instancier massivement d'un objet par une technique, puis l'autre, etc..
    Le test systématique pour chaque objet deviendrait vite assez lourd.

    Je cherche donc une tendance selon la complexité (attributs (type, nombre), complexité du traitement dans le constructeur ) qui permettrait de choisir le plus efficacement la méthode d'instanciation.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    A mon avis, tu pars sur la mauvaise voie.
    As tu suffisamment analysé d'où viennent les problèmes de performances, avant d'essayer de faire ce genre "d'optimisation" ?

    La seule chose que tu risques de gagner, c'est un code moins lisible et pas forcément plus performant.

    Pour moi, tu veux créer un objet simplement, tu utilises new. Tu peux utiliser le design pattern factory sachant que derrière, si tu n'as pas de besoin particulier, tu utiliseras des news.
    Tu veux une copie d'un objet, tu peux utiliser clone, bien que beaucoup de personnes le déconseillent, ou un constructeur par copie.
    Tu as besoin de charger de nouvelles classes à l'exécution et de travailler sur des objets que tu ne connais pas, alors utilises l'API de reflection, et le fameux Class.forName(maClasse);

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par plawyx Voir le message
    Comme le test que j'ai fait avec l'objet Personne et deux attributs String qui me donne une instanciation avec "new" 3 fois plus rapide qu'en utilisant clone(): pourquoi?
    Comme ça a déjà été dit, là n'est pas la question. Je n'ai donc pas spécialement réfléchi au pourquoi. En principe nous sommes censé utiliser ce dont nous avons besoin : pour créer, new. Pour dupliquer : clone() (ou éventuellement un autre mécanisme fourni.)
    Faire au mieux une fois que la bonne méthode est utilisée, c'est le travail de Java, pas le nôtre. On est pas des machines, on les programme, les machines. Je ne dis pas que Java ne se trompe jamais, mais, tu l'as déjà vu se tromper, toi ? Alors utilise ce qu'il faut utiliser, tu réfléchiras à faire autrement quand tu auras une raison de le faire.

    En l'occurrence, avec Calendar la raison était simple : créer un nouveau calendrier l'initialise à la date et heure présente, ce qui est complexe. ça détermine aussi les propriétés du calendrier à utiliser : time zone, grégorien, japonais, bouddhique, ce genre de choses. Créer un nouveau calendrier à date, heure et propriétés identiques, zappe cette initialisation et gagne donc du temps.

    Mais bref : pourquoi l'inverse avec Personne. Sans doute parce qu'en l'occurrence ta classe est extrêmement simple, et son constructeur et clone() n'ont quasi rien à faire. Dans ce cas c'est les optimisations que Java fait par défaut, qui priment. Vu que dans le monde réel, on clone rarement et on construit souvent, rien d'étonnant qu'un constructeur soit plus facilement optimisé.
    En réalité, pour des raisons historiques, clone() est contraint à beaucoup de choses et n'est pratique que dans des cas très précis. Il fait des choses qui s'optimisent mal, et a effectivement de bonnes chances d'être moins performant. Mais il est très rare que ces performances soient significatives face au reste des performances. S'il est peu utilisé c'est parce qu'il est peu pratique, rarement parce qu'on veut optimiser.

    Concernant class.forName().newInstance(), il est évident que c'est très peu performant puisqu'on commence par identifier la classe par son nom. Cela sert uniquement quand on ne connaît pas la classe à utiliser avant l'exécution. Par exemple, si on a plusieurs implémentations d'un algorithme de tri, et qu'on choisit lequel utiliser par configuration dans un fichier texte. Dans ce cas, class.forName() permet d'utiliser la classe indiquée dans le fichier texte.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Neoforce XNA (problème pour retirer un objet créér)
    Par khaled_ dans le forum XNA/Monogame
    Réponses: 4
    Dernier message: 17/08/2011, 18h27
  2. tag pour transfomer des objets java en objets javascript
    Par aminaoussaleh dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/12/2009, 18h34

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