5.FreshMinutes.IT – Java & IT

5 minutes pour consolider ses connaissances en Java et dans les Nouvelles Technos.
  • Accueil
  • À propos
  • Télécharger Java
  • Contact, Twitter, Tumblr & Buzz

Performances des Getters/Setters pour les JavaBeans

Eric Vialle | Vendredi 16 mai 2008 | 23:15


  • Google Buzz

Afin d’accéder aux variables d’instances d’un objet, on n’appelle rarement directement ces variables: on utilise des accesseurs/mutateurs ou Getter/Setter. Nous allons tenter de voir si ce type de pattern, aussi vieux que l’objet, est pénalisante.

Qu’est ce qu’un JavaBean ?

(Source: Wikipedia)

Un composant JavaBean est une simple classe Java qui respecte certaines conventions sur le nommage des méthodes, la construction et le comportement. Le respect de ces conventions rend possible l’utilisation, la réutilisation, le remplacement et la connexion de JavaBeans par des outils de développement.

Les conventions à respecter sont les suivantes :

  • La classe doit être “Serializable” pour pouvoir sauver et restaurer l’état d’instances de cette classe ;
  • La classe doit posséder un constructeur sans argument ;
  • Les propriétés de la classe (Variables d’instances) doivent être accessibles via des méthodes suivant elles aussi des conventions de nommage ;
  • La classe doit contenir les méthodes d’interception d’événements nécessaires.

Exemple de Javabean:

  1. // PersonBean.java
  2.  
  3. public class PersonBean implements java.io.Serializable {
  4.     private String name;
  5.     private boolean deceased;
  6.  
  7.     // Constructeur par défaut (Ne prenant pas d'arguments).
  8.     public PersonBean() {
  9.     }
  10.  
  11.     public String getName() {
  12.         return (this.name);
  13.     }
  14.     public void setName(String name) {
  15.         this.name = name;
  16.     }
  17.     /* Différentes sémantiques pour les booléens. (get vs is)
  18.        Ici nous optons pour un préfixe is. */
  19.     public boolean isDeceased() {
  20.         return (this.deceased);
  21.     }
  22.     public void setDeceased(boolean deceased) {
  23.         this.deceased = deceased;
  24.     }
  25. }

Il existe des critiques à ce genre d’architecture comme l’explique Allen Holub sur JavaWorld. L’utilisation de mutateurs et d’acesseurs ne ferait que complexifier le code, sans y apporter de réelle souplesse. Il irait même contre les principes d’Extreme Programming qui demande du code simple, sans forcement se soucier du lendemain

Procédure de tests

Nous allons principalement comparer les performances d’accès à une variable d’instance en lecture et en écriture.

On distingue deux sortes de variables: les primitives et les objets.

Il existe 3 sortes d’écritures, l’écriture directe en utilisant la variable d’instance public et l’écriture via un accesseur, avec utilisation ou non du mot clef final sur l’argument.

Il existe 2 sortes de lectures, la lecture directe en utilisant la variable d’instance public et l’écriture via un mutateur.

Je vais tester ces différents cas avec un Athlon 3000+ sous Windows XP 32 bits SP3 et Java 6. Je m’assurai durant l’expérience que le Garbage Collector n’est pas appelé.

Résultats

Les tests pour chaque type d’instruction ont été répété 1 milliard de fois sur cette classe instanciée:

  1. /**
  2. * Notre JavaBean de test.
  3. */
  4. class TestObjectBean implements Serializable {
  5.  
  6.     /** accés direct à la primitive. */
  7.     public int myPrimitive;
  8.  
  9.     /** accés direct à l'objet. */
  10.     public Object myObject;
  11.  
  12.     /** Getter d'accés à la primitive. */
  13.     public int getMyPrimitive() {
  14.         return myPrimitive;
  15.     }
  16.  
  17.     /** Setter avec final pour une primitive. */
  18.     public void setFinalMyPrimitive(final int myPrimitive) {
  19.         this.myPrimitive = myPrimitive;
  20.     }
  21.  
  22.     /** Setter sans final pour une primitive. */
  23.     public void setMyPrimitive(int myPrimitive) {
  24.         this.myPrimitive = myPrimitive;
  25.     }
  26.  
  27.     /** Getter d'accés à l'objet. */
  28.     public Object getMyObject() {
  29.         return myObject;
  30.     }
  31.  
  32.     /** Setter sans final pour un objet. */
  33.     public void setMyObject(Object myObject) {
  34.         this.myObject = myObject;
  35.     }
  36.  
  37.     /** Setter avec final pour un objet. */
  38.     public void setFinalMyObject(final Object myObject) {
  39.         this.myObject = myObject;
  40.     }
  41. }

On constate que l’utilisation de final, rend le mutateur légèrement plus rapide pour les objets. Le contenu de la variable ou la référence de l’objet n’a pas besoin d’être recopié en utilisant final. Toutefois les conditions de tests ne permettent pas de conclure, avec un si petit écart, que l’utilisation des accesseurs et des mutateurs sont réellement pénalisant d’un point de vue des performances. Pour ma part, je continuerai à les utiliser ;)

Ces chiffres ne sont pas parfaits. Bien que l’exécution de ce Benchmark a été effectué sur un OS qui était le moins chargé possible, certaines expériences rapportaient que la lecture directe était plus lente que de passer par un accesseur!!!! Cela me renforce dans l’idée que l’impact niveau performance est infinitésimale.

A lire:

  • Les JavaBean sur Wikipedia
  • Les Getters/Setter sont l’enfer [en]
  • L’Extreme Programming sur Wikipedia

Vous pouvez télécharger la classe Java utilisée pour faire ce Benchmark.


Catégories
Dévelopement Tips, J2ME, J2SE, Java, Java EE
Tags
getter/setter, Java, javabean, pattern, performance
Flux rss des commentaires
Flux rss des commentaires
Trackback
Trackback

« JVM Tuning – Optimiser les performances de la machine virtuelle Tutoriel Java Web Start – 5 minutes pour passer d’une appli desktop à une appli web »

Leave a Reply

Cliquer ici pour annuler la réponse.

Articles récents

  • Optimiser le temps de chargement pour le web mobile avec iPhone, jQTouch, Struts 2 et Tomcat
  • La philosophie du Domain Driven Design User Group et l’état des lieux * Users Group en Février 2010
  • Introduction au NoSQL (et de Redis) ou le compte rendu du NoSQL User Group Paris de Février 2010
  • Gérer le Cache-Control HTTP dans une application Web Java EE avec Tomcat
  • Compiler son code? “It’s so 2000s” ou un apercu de Play et JRebel
  • Le blog change d’adresse
  • Le Paris JUG a fêté ses 2 ans: compte-rendu
  • Activer la compression GZip sur votre serveur Tomcat, afin d’optimiser le temps de chargement de vos pages

Navigation

  • Actualités Flux pour tous les articles classés dans Actualités
  • Architecture IT Flux pour tous les articles classés dans Architecture IT
  • Base de données Flux pour tous les articles classés dans Base de données
  • Java Flux pour tous les articles classés dans Java
    • Dévelopement Tips Flux pour tous les articles classés dans Dévelopement Tips
    • EDI Flux pour tous les articles classés dans EDI
    • J2ME Flux pour tous les articles classés dans J2ME
    • J2SE Flux pour tous les articles classés dans J2SE
    • Java EE Flux pour tous les articles classés dans Java EE
    • Tutoriel Flux pour tous les articles classés dans Tutoriel
  • Non classé Flux pour tous les articles classés dans Non classé
  • NoSQL Flux pour tous les articles classés dans NoSQL

Promo

Mots Clefs

adobe apache application web Base de données benchmark bugs c# checkstyle dérivation eclipse find bugs findbugs flex framework play google gzip http iPhone jar Java Java User Group java web start JVM microsoft mysql object objet open source optimisation oracle performance plugin pmd polymorphisme qualité recrutement rich internet application serveur silverlight struts struts 2 sun test Tomcat web

WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.

Twitter

  • Photo: Présentation du @JDuchess, le UG ou les hommes amènent le café http://tumblr.com/xbp78awqd 7 hrs ago
  • More updates...

Livres Pour Aller Plus Loin…

Blogoliste

  • Berthou.com
  • Le blog de hugu
  • PHP – Le Blog de Fatiha
  • techno.blog(java4it)
Get Adobe Flash playerPlugin by wpburn.com wordpress themes
rss Flux rss des commentaires valid xhtml 1.1 design by jide powered by Wordpress get firefox