Смотрите пример ниже:
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();
}
}
Вывод:
версия байт-кода java: 8
java.version: 1.8.0_144
[str1.concat (str2)]
среднее время для 10000 конкатенаций: 0,096 мс,
среднее время для 10000 конкатенаций: 0,185 мс,
среднее время для 10000 конкатенаций: 0,327 мс,
среднее время для 10000 объединений: 0,501 мсек.
Среднее время для 10000 объединений: 0,656 мсек. Ср.
Созданная строка длины: 1950000 за 17745 мс.
Созданная строка длины: 1950000 за 60279 мс.
[Str1.append (str2)]
среднее время для 10000 объединений: 0,002 мсек.
среднее время для 10000 объединений: 0,002 мсек.
среднее время для 10000 объединений: 0,002 мсек.
[str1 + = str2]
среднее время для 10000 объединений: 0,21 мс,
среднее время для 10000 объединений: 0,652 мс
среднее время для 10000 объединений: 1,129 мсек.
Среднее время для 10000 объединений: 1,727 мсек.
среднее время для 10000 объединений: 2.302 мс. avg.
среднее время для 10000 объединений: 0,002 мсек.
среднее время для 10000 объединений: 0,002 мсек. avg
Созданная строка длины: 1950000 в 100 мсек.
По мере увеличения длины строки время конкатенации увеличивается.
Вот где StringBuilder
это определенно необходимо.
Как видите, конкатенация: UUID.randomUUID()+"---"
действительно не влияет на время.
PS: я не думаю, что когда использовать StringBuilder в Java, это действительно дубликат этого.
Этот вопрос говорит оtoString()
что в большинстве случаев не выполняет конкатенации огромных строк.
2019 Обновление
С тех java8
пор все немного изменилось. Кажется, что сейчас (java13) время конкатенации +=
практически такое же, как str.concat()
. Однако StringBuilder
время объединения остается неизменным . (Оригинальный пост выше был немного отредактирован, чтобы добавить более подробный вывод)
версия байт-кода java: 13
java.version: 13.0.1
[str1.concat (str2)]
среднее время для 10000 конкатенаций: 0,047 мс,
среднее время для 10000 конкатенаций: 0,1 мс,
среднее время для 10000 конкатенаций: 0,17 мс,
среднее время для 10000 объединений: 0,255 мс,
среднее время для 10000 объединений: 0,336 мс, avg
Созданная строка длины: 1950000 за 9147 мс
[str1 + = str2]
среднее время для 10000 объединений: 0,037 мс
среднее время для 10000 объединений: 0,097 мс
среднее время для 10000 объединений: 0,249 мсек.
Среднее время для 10000 объединений: 0,326 мсек.
Среднее время для 10000 объединений: 0,298 мсек.
Созданная строка длины: 1950000 за 10191 мс
[str1.append (str2)]
среднее время для 10000 конкатенаций: 0,001 мс,
среднее время для 10000 конкатенаций: 0,001 мс,
среднее время для 10000 конкатенаций: 0,001 мс,
среднее время для 10000 конкатенаций:
Среднее время усреднения 0,001 мсек для 10000 объединений
: среднеквадратичное значение 0,001 мсек. Длина строки: 1950000 в 43 мсек.
Стоит отметить, что bytecode:8/java.version:13
комбинация имеет хороший выигрыш в производительности по сравнению сbytecode:8/java.version:8