7
juillet
2005
Java Performance: préférer valueOf
juillet
2005
Un article de vbrabant
6 Commentaires
Suite à la lecture de certains message dans le forum, je me suis également décidé à commencer une catégorie sur des conseils de base concernant les performances.
Qu’est ce qui est plus performant ?
Integer i = new Integer(10);
ou
Integer i = Integer.valueOf(10);
Qu’en pensez-vous ?
EDIT: La réponse est sur la deuxième page.
6 Commentaires + Ajouter un commentaire
Commentaires récents
Archives
- janvier 2012
- novembre 2010
- février 2009
- janvier 2009
- décembre 2008
- septembre 2008
- août 2008
- décembre 2007
- octobre 2007
- septembre 2007
- juillet 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- avril 2006
- février 2006
- janvier 2006
- décembre 2005
- novembre 2005
- octobre 2005
- septembre 2005
- août 2005
- juillet 2005
- juin 2005
- mai 2005
- avril 2005
Catégories
- Certification
- Défis
- Devoxx
- Devoxx 2008
- Devoxx 2010
- Devoxx France 2012
- Divers
- Événements Java
- Fiches
- Hardware
- In English
- Java
- JavaDay 2006
- JavaFX
- JavaOne 2005
- JavaOne 2006
- JavaOne 2007
- Javapolis 2005
- Javapolis 2006
- Javapolis 2007
- JBoss
- Livres
- Mac
- NetBeans
- OpenJDK
- Pensée
- Performance
- Perles
- Sun Tech Days Paris 2007
- Traduction
>attention que l’instantiation d’un objet est TRES couteuse en temps !!!
héhé ok, mais alors que pour les valeurs entre -128 et +127
A propos de valueOf :
If a new Integer instance is not required, this method should generally be used in preference to the constructor Integer(int), as this method is likely to yield significantly better space and time performance by caching frequently requested values.
…donc pour eux, c’est juste parce que ce sont des valeurs courantes :p
Pour JMax:
attention que l’instantiation d’un objet est TRES couteuse en temps !!!
Pour Lunatix:
Modifie ton code comme suit
for (int i = 0; i < 100; i++) { <br />
Integer j = new Integer(i); <br />
Integer k = new Integer(i+2); <br />
Integer l = new Integer(i-1); <br />
Integer m = new Integer(i+1); <br />
} <br />
}
Et compare les deux sur ta machine. Tu devrais remarquer une différence TRES significative.
Pour adiGuba:
Oui, c’est seulement depuis JDK 5. Et La cache est limitée aux nombres entre -128 et +127.
Personellement, j’aurais caché entre 0 et 255 car, dans la majorité des cas, on n’utilise que des nombres positifs pour les index. Mais je suppose que s’ils ont choisi -128 et +127, c’est qu’ils avaient leur raison. Mais j’aimerais tout de même connaitre la justification. Juste par curiosité.
Personnellement en voyant le code source je dirais que la version
est en générale plus « performante » en nombre d’instructions effectuées
this.value = value; <br />
}
il faut cependant voir qu’il y a bien un cache avec la version valueOf mais seulement pour des entiers compris entre -128 et +127
final int offset = 128; <br />
if (i >= -128 && i
Personnellement en voyant le code source je dirais que la version
est en générale plus « performante » en nombre d’instructions effectuées
public Integer(int value) <br />
{ <br />
this.value = value; <br />
} <br />
il faut cependant voir qu’il y a bien un cache avec la version valueOf mais seulement pour des entiers compris entre -128 et +127
public static Integer valueOf(int i) { <br />
final int offset = 128; <br />
if (i >= -128 && i
si je fais
for (int i = 0; i < 10000; i++) { <br />
Integer j = new Integer(i); <br />
Integer k = new Integer(i+2); <br />
Integer l = new Integer(i-1); <br />
Integer m = new Integer(i+1); <br />
} <br />
}
et son equivalent avec l’autre conversion…
j’obtient 149109 et 151563ms… en clair c’est kif kif quoi
Salut,
Il me semble que valueOf() gère un cache, ce qui fait qu’il doit être plus rapide si on utilise plusieurs fois les mêmes valeurs…
Mais avec des valeurs différentes ce doit être kif-kif…
Au fait, valueOf(int) c’est depuis Java 5.0 seulement et c’est ce qui est utilisé par l’autoboxing :
est compilé comme :
a++