Nie wydaje mi się, aby próba optymalizacji wydajności w ten sposób miała sens. Dzisiaj (2019) obie statystyki działają przez około 11 sekund dla pętli 100.000.000 na moim laptopie 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 (deklaracja wewnątrz pętli) i 8236 ms (deklaracja poza pętlą)
Nawet jeśli uruchamiam programy do dedykowania adresów z kilkoma miliardami pętli, różnica wynosi 2 sekundy. dla 100 milionów pętli nie robi żadnej różnicy, ponieważ te programy działają godzinami. Pamiętaj również, że sytuacja wygląda inaczej, jeśli masz tylko jedną instrukcję 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 ms (pętla wewnętrzna), 3555 ms (pętla zewnętrzna) Pierwsza instrukcja, która tworzy StringBuilder w pętli, jest w tym przypadku szybsza. A jeśli zmienisz kolejność wykonywania, jest to znacznie szybsze:
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 ms (pętla zewnętrzna), 2908 ms (pętla wewnętrzna)
Pozdrawiam, Ulrich