Je ne pense pas qu'il soit logique d'essayer d'optimiser les performances comme ça. Aujourd'hui (2019), les deux états fonctionnent environ 11sec pour 100.000.000 de boucles sur mon ordinateur portable I5:
String a;
StringBuilder sb = new StringBuilder();
long time = 0;
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
sb3.append("someString2");
sb3.append("someStrin4g");
sb3.append("someStr5ing");
sb3.append("someSt7ring");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
sb.append("someString2");
sb.append("someStrin4g");
sb.append("someStr5ing");
sb.append("someSt7ring");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 11000 ms (déclaration à l'intérieur de la boucle) et 8236 ms (déclaration à l'extérieur de la boucle)
Même si je suis en train d'exécuter des programmes de dédoublement d'adresses avec quelques milliards de boucles, une différence de 2 sec. pour 100 millions de boucles ne fait aucune différence car ces programmes fonctionnent pendant des heures. Sachez également que les choses sont différentes si vous n'avez qu'une seule instruction d'ajout:
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3416 ms (boucle intérieure), 3555 ms (boucle extérieure) La première instruction qui crée le StringBuilder dans la boucle est plus rapide dans ce cas. Et, si vous changez l'ordre d'exécution, c'est beaucoup plus rapide:
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3638 msec (boucle extérieure), 2908 msec (boucle intérieure)
Cordialement, Ulrich