Zobacz przykład poniżej:
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();
}
}
Wynik:
java bytecode version: 8
java.version: 1.8.0_144
[str1.concat (str2)]
średni czas dla 10000 konkatenacji: 0,096 ms
średni czas dla 10000 konkatenacji: 0,185 ms
średni czas dla 10000 konkatenacji: 0,327 ms
średni czas dla 10000 konkatenacji:
średni czas 0,501 ms dla 10000 konkatenacji: 0,656 ms średni
Utworzony ciąg długości: 1950000 w 17745 ms
[str1 + = str2]
średni czas dla 10000 konkatenacji: 0,21 ms
średni czas dla 10000 konkatenacji: 0,652 ms
średni czas dla 10000 konkatenacji: 1,129 ms śr.
Średni czas dla 10000 konkatenacji: 1,727 ms śr
średni czas dla 10000 konkatenacji: 2,302 ms średni
Utworzony ciąg długości: 1950000 w 60279 ms
[str1.append (str2)]
średni czas dla 10000 konkatenacji: 0,002 ms
średni średni czas dla 10000 konkatenacji: 0,002 ms
średni średni czas dla 10000 konkatenacji: 0,002 ms
średni średni czas dla 10000 konkatenacji: 0,002 ms
średni czas dla 10000 konkatenacji: 0,002 ms średni
Utworzony ciąg długości: 1950000 w 100 ms
Wraz ze wzrostem długości łańcucha rośnie czas konkatenacji.
To jest StringBuilder
zdecydowanie potrzebne.
Jak widać, konkatenacja: UUID.randomUUID()+"---"
tak naprawdę nie wpływa na czas.
PS: Nie sądzę, kiedy korzystanie z StringBuilder w Javie jest naprawdę duplikatem tego.
To pytanie mówi o tym, toString()
które przez większość czasu nie wykonują konkatenacji wielkich łańcuchów.
Aktualizacja 2019
Od java8
czasów wszystko się nieco zmieniło. Wydaje się, że teraz (java13) czas konkatenacji +=
jest praktycznie taki sam jak str.concat()
. Jednak StringBuilder
czas konkatenacji jest wciąż stały . (Oryginalny post powyżej został nieco zmodyfikowany, aby dodać więcej pełnych wyników)
java bytecode version: 13
java.version: 13.0.1
[str1.concat (str2)]
średni czas dla 10000 konkatenacji: 0,047 ms
średni czas dla 10000 konkatenacji: 0,1 ms
średni czas dla 10000 konkatenacji: 0,17 ms
średni czas dla 10000 konkatenacji:
średni czas 0,255 ms dla 10000 konkatenacji: 0,366 ms średni
Utworzony ciąg długości: 1950000 w 9147 ms
[str1 + = str2]
średni czas dla 10000 konkatenacji: 0,037 ms
średni czas dla 10000 konkatenacji: 0,097 ms
średni czas dla
Średni czas 10000 konkatenacji: 0,249 ms średni czas 10000 konkatenacji: 0,298 ms
średni czas dla 10000 konkatenacji: 0,326 ms śr.
Utworzony ciąg długości: 1950000 w 10191 ms
[str1.append (str2)]
średni czas dla 10000 konkatenacji: 0,001 ms
średni średni czas dla 10000 konkatenacji: 0,001 ms
średni czas dla 10000 konkatenacji: 0,001 ms
średni średni czas dla 10000 konkatenacji: 0,001 ms
średni czas dla 10000 konkatenacji: 0,001 ms średni
Utworzony ciąg długości: 1950000 w 43 ms
Warto zauważyć, że bytecode:8/java.version:13
kombinacja ma dobrą wydajność w porównaniu dobytecode:8/java.version:8