Я не думаю, що це має сенс намагатися оптимізувати подібну ефективність. Сьогодні (2019 р.) Обидва тиски працюють близько 11 сек на 100 000 000 циклів на моєму ноутбуці I5:
String a;
StringBuilder sb = new StringBuilder();
long time = 0;
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
sb3.append("someString2");
sb3.append("someStrin4g");
sb3.append("someStr5ing");
sb3.append("someSt7ring");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
sb.append("someString2");
sb.append("someStrin4g");
sb.append("someStr5ing");
sb.append("someSt7ring");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 11000 мсек (декларація всередині циклу) і 8236 мсек (оголошення зовнішньої петлі)
Навіть якщо я запускаю програми для дедублікації адреси з кількома мільярдами циклів різницею в 2 сек. для 100 мільйонів циклів не має ніякої різниці, оскільки ці програми працюють годинами. Також пам’ятайте, що все є інакше, якщо у вас є лише одне додаток:
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3416 мсек (внутрішній цикл), 3555 мсек (зовнішній цикл) Перше твердження, яке створює StringBuilder в циклі, швидше в цьому випадку. І, якщо ви зміните порядок виконання, це набагато швидше:
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3638 мсек (зовнішня петля), 2908 мсек (внутрішня петля)
З повагою, Ульріх