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 StringBuilder
besoin 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 java8
temps, 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 StringBuilder
temps 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:13
combinaison présente un bon avantage en termes de performances par rapport àbytecode:8/java.version:8