Ваше объяснение, почему оно неэффективно, является точным, по крайней мере, на языках, с которыми я знаком (C, Java, C #), хотя я бы не согласился с тем, что повсеместно распространено выполнение большого количества конкатенации строк. В C # код я работаю, есть обильное использование StringBuilder
, String.Format
и т.д. , которые все памяти экономии techiniques , чтобы избежать чрезмерной перераспределению.
Поэтому, чтобы получить ответ на ваш вопрос, мы должны задать еще один вопрос: если объединение строк никогда не является проблемой, почему классы любят 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 ++ и не заботиться об освобождении памяти.