OVH Cloud OVH Cloud

Prodigieux type String

11 réponses
Avatar
Julien Arlandis
System.out.println("début");

String toto = "";

for(int i=0;i<100000;i++) toto += "a";

System.out.println("fin");


Sur ma machine cadencée à 2,4 Ghz 1 minute s'écoule entre l'affichage de
"début" et "fin" !!! Pourquoi le type String est il si lent en java?

10 réponses

1 2
Avatar
oliv
Julien Arlandis wrote:

for(int i=0;i<100000;i++) toto += "a";


j'insiste : StringBuffer !

--
oliv

Avatar
Arnaud Roger
"Julien Arlandis" a écrit dans le message de
news:40208e9c$0$25453$
System.out.println("début");

String toto = "";

for(int i=0;i<100000;i++) toto += "a";

System.out.println("fin");


Sur ma machine cadencée à 2,4 Ghz 1 minute s'écoule entre l'affichage de
"début" et "fin" !!! Pourquoi le type String est il si lent en java?


http://www.javaworld.com/javaworld/jw-03-2000/jw-0324-javaperf.html

Arnaud R.

Avatar
LR
System.out.println("début");

String toto = "";

for(int i=0;i<100000;i++) toto += "a";

System.out.println("fin");


Sur ma machine cadencée à 2,4 Ghz 1 minute s'écoule entre l'affichage de
"début" et "fin" !!! Pourquoi le type String est il si lent en java?


Le type string est un savant mélange d'objet et de primitif. Lorsque tu fais
toto+="a", c'est pareil que si tu faisais toto = new String( toto+ "a" ).

Je suppose que c'est toutes ces instanciations qui prennnent du temps et que
si tu utilisais un objet StringBuffer ce serait plus rapide...

Avatar
Kupee
LR wrote:
Le type string est un savant mélange d'objet et de primitif. Lorsque tu fais
toto+="a", c'est pareil que si tu faisais toto = new String( toto+ "a" ).

Je suppose que c'est toutes ces instanciations qui prennnent du temps et que
si tu utilisais un objet StringBuffer ce serait plus rapide...


C'est clair et net, et de préférence en définissant la taille du
stringbuffer lors de l'instantiation (un petit calcul de rien du tout a
faire) afin de gagner encore beaucoup en performances (car sinon il
s'initialise a 16 char si je me souviens bien, et quand il les atteind,
ben hop il instantie un nouveau tableau de char plus grand, et fait un
arraycopy dedans, et ainsi de suite.
C'est d'ailleurs pareil pour les vector, arraylist, hashtable ... bref
tout ce qui est a base de tableau

Avatar
Julien Arlandis
Le type string est un savant mélange d'objet et de primitif. Lorsque
tu fais
toto+="a", c'est pareil que si tu faisais toto = new String( toto+ "a" ).

Je suppose que c'est toutes ces instanciations qui prennnent du temps
et que
si tu utilisais un objet StringBuffer ce serait plus rapide...



C'est clair et net, et de préférence en définissant la taille du
stringbuffer lors de l'instantiation (un petit calcul de rien du tout a
faire) afin de gagner encore beaucoup en performances (car sinon il
s'initialise a 16 char si je me souviens bien, et quand il les atteind,
ben hop il instantie un nouveau tableau de char plus grand, et fait un
arraycopy dedans, et ainsi de suite.


Pour remplir le StringBuffer de 16 à x éléments, il va redimensionner
sqrt(x)/4 fois, ce qui est tout de même négligeable devant l'opérateur
de concaténation += du String où le redimensionnement se fera x/n fois,
où n est la taille moyenne des blocs que je veux bufferiser.
En initialisant mon StringBuffer à 1024 chars, je gagne seulement 6
redimensionnements.

C'est d'ailleurs pareil pour les vector, arraylist, hashtable ... bref
tout ce qui est a base de tableau



Avatar
vclassine
Julien Arlandis wrote in message news:<40208e9c$0$25453$...
System.out.println("début");

String toto = "";

for(int i=0;i<100000;i++) toto += "a";

System.out.println("fin");



Sur ma machine cadencée à 2,4 Ghz 1 minute s'écoule entre l'affichage de
"début" et "fin" !!! Pourquoi le type String est il si lent en java?
Pour être simple d'utilisation et sécurisé dans les cas les plus courants.


Si on des besoins différents (optim) StringBuffer...

Avatar
Kupee
Julien Arlandis wrote:
Pour remplir le StringBuffer de 16 à x éléments, il va redimensionner
sqrt(x)/4 fois, ce qui est tout de même négligeable devant l'opérateur
de concaténation += du String où le redimensionnement se fera x/n fois,
où n est la taille moyenne des blocs que je veux bufferiser.
En initialisant mon StringBuffer à 1024 chars, je gagne seulement 6
redimensionnements.


Tu as raison c'est négligeable face a la concaténation de Strings, mais
le gain de performances en pourcentage est tout de même conséquent :
en faisant 10 millions d'itérations (faut voir un peu plus grand pour
comparer avec des valeurs un peu plus stable que le milisecondes ;)
En initialisant pas le stringbuffer je met 2.7 secondes.
en l'initialisant 2.2. D'accord c'est faible par rapport au gain que le
Stringbuffer venait d'apporter mais dans un soft c'set quand même pas mal.
Et pour tester, au lieu d'ajouter des "a" j'ai ajouté des 'a', et là ca
va bien plus vite, 1 seconde et 600ms respectivement (suivant qu'on
initialise le StringBuffer ou non)

Avatar
ZeGrunt
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Salut.

LR wrote:
Le type string est un savant mélange d'objet et de primitif. Lorsque
tu fais

toto+="a", c'est pareil que si tu faisais toto = new String( toto+ "a" ).


Tiens, je croyais que toto+="a" était plus ou moins traduit par :
toto = (new StringBuffer(toto)).append("a").toString()

J'ai tort ? Si oui, quelle est la véritable "traduction" ?

Merci,

ZeGrunt.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD4DBQFAIe/LnLjyGhlEgFIRAtt2AJjH0Y8k4bZH9e7DClYPJ+N1li+kAJoDZ1Ps
KC5RPo6piKTanmdXDK6rMA= =fXpq
-----END PGP SIGNATURE-----

Avatar
Christophe M
ZeGrunt wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Salut.

LR wrote:

Le type string est un savant mélange d'objet et de primitif. Lorsque


tu fais

toto+="a", c'est pareil que si tu faisais toto = new String( toto+ "a" ).



Tiens, je croyais que toto+="a" était plus ou moins traduit par :
toto = (new StringBuffer(toto)).append("a").toString()

J'ai tort ? Si oui, quelle est la véritable "traduction" ?

Merci,

ZeGrunt.


Tout dépend du compilateur, celui d'IBM ne fait pas les mêmes
"optimisations" que celui de SUN.


Avatar
Kupee
ZeGrunt wrote:
toto+="a", c'est pareil que si tu faisais toto = new String( toto+ "a" ).



Tiens, je croyais que toto+="a" était plus ou moins traduit par :
toto = (new StringBuffer(toto)).append("a").toString()

J'ai tort ? Si oui, quelle est la véritable "traduction" ?


Je penses que tu as tort, remarque je suis pas sur que ce serait très
intéréssant d'instantier un StringBuffer pour chaque concaténation. Le
Stringbuffer n'est intéréssant que si on l'utilise pour un nombre
conséquent de concaténations


1 2