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...
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
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
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
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
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
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
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...
Julien Arlandis <juliendusud@free.fr> wrote in message news:<40208e9c$0$25453$626a54ce@news.free.fr>...
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...
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...
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)
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)
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)
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
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.
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
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
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