Vedi l'esempio seguente:
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();
}
}
Produzione:
versione bytecode java: 8
java.version: 1.8.0_144
[str1.concat (str2)]
tempo medio per 10000 concatenazioni: 0,096 ms
tempo medio avg per 10000 concatenazioni: 0,185 ms
tempo medio avg per 10000 concatenazioni: 0,327 ms
tempo medio per 10000 concatenazioni: 0,501 ms
tempo medio avg per 10000 concatenazioni: 0,656 ms avg
Stringa creata di lunghezza: 1950000 in 17745 ms
[str1 + = str2]
tempo medio per 10000 concatenazioni: 0,21 ms
tempo medio per 10000 concatenazioni: 0,652 ms
tempo medio per 10000 concatenazioni: 1.129 ms
tempo medio per 10000 concatenazioni: 1.727 ms media
tempo medio per 10000 concatenazioni: 2.302 ms media
stringa creata di lunghezza: 1950000 in 60279 ms
[str1.append (str2)]
tempo medio per 10000 concatenazioni: 0,002 ms
tempo medio medio per 10000 concatenazioni: 0,002 ms
tempo medio medio per 10000 concatenazioni: 0,002 ms
tempo medio avg per 10000 concatenazioni: 0,002 ms
tempo medio avg per 10000 concatenazioni: 0,002 ms avg
Stringa creata di lunghezza: 1950000 in 100 ms
All'aumentare della lunghezza della stringa, aumenta anche il tempo di concatenazione.
Ecco dove StringBuilder
è assolutamente necessario.
Come vedi, la concatenazione:, UUID.randomUUID()+"---"
non influisce davvero sul tempo.
PS: Non penso quando usare StringBuilder in Java sia davvero un duplicato di questo.
Questa domanda parla di toString()
quale il più delle volte non esegue concatenazioni di stringhe enormi.
Aggiornamento 2019
Da allora le java8
cose sono cambiate un po '. Sembra che ora (java13), il tempo di concatenazione +=
sia praticamente uguale a str.concat()
. Tuttavia, il StringBuilder
tempo di concatenazione è ancora costante . (Il post originale sopra è stato leggermente modificato per aggiungere un output più dettagliato)
versione bytecode java: 13
java.version: 13.0.1
[str1.concat (str2)]
tempo medio per 10000 concatenazioni: 0,047 ms
tempo medio per 10000 concatenazioni: 0,1 ms
tempo medio per 10000 concatenazioni: 0,17 ms
tempo medio per 10000 concatenazioni: 0,255 ms
tempo medio avg per 10000 concatenazioni: 0,336 ms avg
Stringa di lunghezza creata: 1950000 in 9147 ms
[str1 + = str2]
tempo medio per 10000 concatenazioni: 0,037 ms
tempo medio avg per 10000 concatenazioni: 0,097 ms
tempo medio per 10000 concatenazioni: 0,249 ms
media tempo per 10000 concatenazioni: 0,298 ms media
tempo medio per 10000 concatenazioni: 0,326 ms tempo medio
creato stringa di lunghezza: 1950000 in 10191 ms
[str1.append (str2)]
tempo medio per 10000 concatenazioni: 0,001 ms
tempo medio medio per 10000 concatenazioni: 0,001 ms
tempo medio medio per 10000 concatenazioni: 0,001 ms
tempo medio avg per 10000 concatenazioni: 0,001 ms
tempo medio avg per 10000 concatenazioni: 0,001 ms avg
Stringa creata di lunghezza: 1950000 in 43 ms
Vale la pena notare anche che la bytecode:8/java.version:13
combinazione ha un buon vantaggio in termini di prestazioni rispetto abytecode:8/java.version:8