Voir l'exemple ci-dessous:
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();
}
}
Production:
version du bytecode java: 8
java.version: 1.8.0_144
[str1.concat (str2)]
temps moyen pour 10000 concaténations: 0,096 ms
temps moyen pour 10000 concaténations: 0,185 ms
temps moyen pour 10000 concaténations: 0,327 ms
temps moyen pour 10000 concaténations: 0,501 ms de
temps moyen pour 10000 concaténations: 0,656 ms de moyenne
Chaîne de longueur créée: 1950000 en 17745 ms
[str1 + = str2]
temps moyen pour 10000 concaténations: 0,21 ms de
temps moyen pour 10000 concaténations: 0,652 ms
temps moyen pour 10000 concaténations: 1,129 ms
temps moyen pour 10000 concaténations: 2,302 ms moy
temps moyen pour 10000 concaténations: 1,727 ms moy
Chaîne créée de longueur: 1950000 en 60279 ms
[str1.append (str2)]
temps moyen pour 10000 concaténations: 0,002 ms
temps moyen pour 10000 concaténations: 0,002 ms
temps moyen pour 10000 concaténations: 0,002 ms
temps moyen pour 10000 concaténations: 0,002 ms
temps moyen pour 10000 concaténations: 0,002 ms moyenne
Longueur de la chaîne créée: 1950000 en 100 ms
À mesure que la longueur de chaîne augmente, le temps de concaténation augmente également.
C'est là que le StringBuilderbesoin est certain.
Comme vous le voyez, la concaténation:UUID.randomUUID()+"---" n'affecte pas vraiment le temps.
PS: Je ne pense pas que quand utiliser StringBuilder en Java est vraiment un doublon de cela.
Cette question parle de la toString()plupart du temps qui n'effectue pas de concaténation d'énormes cordes.
Mise à jour 2019
Depuis des java8temps, les choses ont un peu changé. Il semble que maintenant (java13), le temps de concaténation de +=soit pratiquement le même que str.concat(). Cependant, le StringBuildertemps de concaténation est toujours constant . (Le message d'origine ci-dessus a été légèrement modifié pour ajouter une sortie plus détaillée)
java bytecode version: 13
java.version: 13.0.1
[str1.concat (str2)]
temps moyen pour 10000 concaténations: 0,047 ms
temps moyen pour 10000 concaténations: 0,1 ms
temps moyen pour 10000 concaténations: 0,17 ms
temps moyen pour 10000 concaténations: 0,255 ms
durée moyenne pour 10000 concaténations: 0,336 ms moyenne
Chaîne créée de longueur: 1950000 en 9147 ms
[str1 + = str2]
durée moyenne pour 10000 concaténations: 0,037 ms moyenne
durée moyenne pour 10000 concaténations: 0,097 ms moyenne
temps moyen pour 10000 concaténations: 0,249 ms
temps moyen pour 10000 concaténations: 0,326 ms moy
temps moyen pour 10000 concaténations: 0,298 ms moyenne
Chaîne créée de longueur: 1950000 en 10191 ms
[str1.append (str2)]
temps moyen pour 10000 concaténations: 0,001 ms temps moyen en
moyenne pour 10000 concaténations: 0,001 ms temps moyen en
moyenne pour 10000 concaténations: 0,001 ms temps moyen en
moyenne pour 10000 concaténations: 0,001 ms
durée moyenne pour 10000 concaténations: 0,001 ms moyenne
Chaîne créée de longueur: 1950000 en 43 ms
Il convient de noter également que la bytecode:8/java.version:13combinaison présente un bon avantage en termes de performances par rapport àbytecode:8/java.version:8