Siehe das folgende Beispiel:
static final int MAX_ITERATIONS = 50000;
static final int CALC_AVG_EVERY = 10000;
public static void main(String[] args) {
printBytecodeVersion();
printJavaVersion();
case1();//str.concat
case2();//+=
case3();//StringBuilder
}
static void case1() {
System.out.println("[str1.concat(str2)]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
String str = "";
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str = str.concat(UUID.randomUUID() + "---");
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void case2() {
System.out.println("[str1+=str2]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
String str = "";
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str += UUID.randomUUID() + "---";
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void case3() {
System.out.println("[str1.append(str2)]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
StringBuilder str = new StringBuilder("");
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str.append(UUID.randomUUID() + "---");
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void saveTime(List<Long> executionTimes, long startTime) {
executionTimes.add(System.currentTimeMillis() - startTime);
if (executionTimes.size() % CALC_AVG_EVERY == 0) {
out.println("average time for " + executionTimes.size() + " concatenations: "
+ NumberFormat.getInstance().format(executionTimes.stream().mapToLong(Long::longValue).average().orElseGet(() -> 0))
+ " ms avg");
executionTimes.clear();
}
}
Ausgabe:
Java-Bytecode-Version: 8
java.version: 1.8.0_144
[str1.concat (str2)]
durchschnittliche Zeit für 10000 Verkettungen: 0,096 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,185 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,327 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,501 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,656 ms durchschnittlich
Erstellte Zeichenfolge mit einer Länge von 1950000 in 17745 ms
[str1 + = str2]
durchschnittliche Zeit für 10000 Verkettungen: 0,21 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,652 ms
durchschnittliche Zeit für 10000 Verkettungen: 1,129 ms
durchschnittliche Zeit für 10000 Verkettungen: 2,302 ms durchschnittlich
durchschnittliche Zeit für 10000 Verkettungen: 1,727 ms durchschnittlich
Erstellte Zeichenfolge mit einer Länge von 1950000 in 60279 ms
[str1.append (str2)]
durchschnittliche Zeit für 10000 Verkettungen: 0,002 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,002 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,002 ms
durchschnittliche Zeit für 10000 Verkettungen:
Durchschnittliche Zeit von 0,002 ms für 10000 Verkettungen: durchschnittlich 0,002 ms
Erstellte Zeichenfolge mit einer Länge von 1950000 in 100 ms
Wenn die Zeichenfolgenlänge zunimmt, nimmt auch die Verkettungszeit zu.
Hier wird das StringBuilder
definitiv gebraucht.
Wie Sie sehen, UUID.randomUUID()+"---"
wirkt sich die Verkettung: nicht wirklich auf die Zeit aus.
PS: Ich denke nicht, dass die Verwendung von StringBuilder in Java wirklich ein Duplikat davon ist.
Diese Frage spricht darüber, toString()
welche meistens keine Verkettungen von großen Zeichenfolgen ausführt.
Update 2019
Seit java8
einiger Zeit haben sich die Dinge ein wenig geändert. Es scheint, dass jetzt (java13) die Verkettungszeit von +=
praktisch dieselbe ist wie str.concat()
. Die StringBuilder
Verkettungszeit ist jedoch immer noch konstant . (Der ursprüngliche Beitrag oben wurde leicht bearbeitet, um eine ausführlichere Ausgabe hinzuzufügen.)
Java-Bytecode-Version: 13
java.version: 13.0.1
[str1.concat (str2)]
durchschnittliche Zeit für 10000 Verkettungen: 0,047 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,1 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,17 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,255 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,336 ms durchschnittlich
Erstellte Zeichenfolge mit einer Länge von 1950000 in 9147 ms
[str1 + = str2]
durchschnittliche Zeit für 10000 Verkettungen: 0,037 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,097 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,249 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,298 ms durchschnittlich
durchschnittliche Zeit für 10000 Verkettungen: durchschnittlich 0,326 ms
Erstellte Zeichenfolge mit einer Länge von 1950000 in 10191 ms
[str1.append (str2)]
durchschnittliche Zeit für 10000 Verkettungen: 0,001 ms
durchschnittliche Zeit für 10000 Verkettungen: 0,001 ms
durchschnittliche Zeit für 10000 Verkettungen: Durchschnittliche
durchschnittliche Zeit von 0,001 ms für 10000 Verkettungen: Durchschnittliche
durchschnittliche Zeit von 0,001 ms für 10000 Verkettungen: durchschnittlich 0,001 ms
Erstellte Zeichenfolge mit einer Länge von 1950000 in 43 ms
Bemerkenswert bytecode:8/java.version:13
ist, dass auch die Kombination einen guten Leistungsvorteil gegenüber hatbytecode:8/java.version:8