Ваше пояснення, чому воно неефективне, є точним, принаймні мовою, з якою я знайомий (C, Java, C #), хоча я не погоджуюся з тим, що загальновизнаним є велика кількість конкатенації рядків. У коді C #, над яким я працюю, є багато використання StringBuilder
, String.Format
і т. Д., Які є всіма методами збереження пам'яті, щоб уникнути перерозподілу.
Отже, щоб дійти до відповіді на ваше запитання, ми мусимо задати ще одне запитання: якщо ніколи насправді не проблема поєднувати рядки, то чому б класам подобалось StringBuilder
і StringBuffer
існувало ? Чому використання таких класів включено навіть у книги та програми програмування для початківців? Чому, здавалося б, передзрілі поради щодо оптимізації будуть настільки визначними?
Якби більшість розробників, що об'єднують рядки, базувались на своїй відповіді виключно на досвіді, більшість сказала б, що це ніколи не має значення, і використовуватиме такі інструменти на користь "читабельніших" for (int i=0; i<1000; i++) { strA += strB; }
. Але вони його ніколи не вимірювали.
Справжню відповідь на це запитання можна знайти в цій відповіді "SO" , яка виявляє, що в одному випадку, при об'єднанні 50 000 рядків (що може залежати від вашої програми, навіть звичайні випадки), це призвело до 1000-кратного успіху .
Якщо продуктивність в буквальному сенсі нічого не означає, все одно об'єднуйтесь. Але я не погоджуюся з тим, що використовувати альтернативи (StringBuilder) складно або менш читабельно , і тому було б розумною практикою програмування, яка не повинна викликати захист "передчасної оптимізації".
ОНОВЛЕННЯ:
Я думаю, що це зводиться до цього, це знати свою платформу та дотримуватися її кращих практик, які, на жаль, не є універсальними . Два приклади з двох різних "сучасних мов":
- В іншому SO відповідь , то точна протилежність були знайдені характеристики (Array.join проти + =) , щоб бути іноді вірно в JavaScript . У деяких браузерах схоже, що конкатенація рядків оптимізується автоматично, а в інших випадках - не. Тож рекомендація (принаймні в цьому питанні) полягає в тому, щоб просто об'єднатись і не турбуватися про це.
- В іншому випадку компілятор Java може автоматично замінити конкатенацію на більш ефективну конструкцію, таку як StringBuilder. Однак, як вказували інші, це неефективізовано, не гарантовано, а використання StringBuilder не зашкодить читабельності. У цьому конкретному випадку я схильний рекомендувати не використовувати конкатенацію для великих колекцій або покладатися на недетерміновану поведінку компілятора Java. Аналогічно, в .NET ніколи не проводиться оптимізація сортування .
Не зовсім кардинальним є гріх не знати одразу всіх нюансів кожної платформи, але ігнорувати важливі проблеми платформи, як це, було б майже як перехід від Java до C ++, а не турбота про обмін пам'яттю.