Non credo che abbia senso cercare di ottimizzare le prestazioni in questo modo. Oggi (2019) entrambe le dichiarazioni sono in esecuzione di circa 11 secondi per 100.000.000 di loop sul mio laptop 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 msec (dichiarazione all'interno del ciclo) e 8236 msec (dichiarazione all'esterno del ciclo)
Anche se sto eseguendo programmi per la pubblicazione degli indirizzi con alcuni miliardi di loop, una differenza di 2 sec. per 100 milioni di cicli non fa alcuna differenza perché quei programmi sono in esecuzione per ore. Inoltre, tieni presente che le cose sono diverse se hai solo un'istruzione append:
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 msec (ciclo interno), 3555 msec (ciclo esterno) La prima istruzione che crea StringBuilder all'interno del ciclo è più veloce in questo caso. E se cambi l'ordine di esecuzione è molto più veloce:
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 (loop esterno), 2908 msec (loop interno)
Saluti, Ulrich