Выбор ответа Junior Строки спрашивают часто обновлено
Почему += в цикле медленно
Вопрос
Почему склейка result += part в цикле на 100 000 итераций работает медленно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Каждый += создаёт новую строку и копирует всё накопленное: O(n²). Строка неизменяема, поэтому += выделяет новую строку длины старой плюс кусок и копирует в неё обе части.
Варианты ответа
- Оператор
+=для строк блокирует поток на время копирования буфера - Строки попадают в пул интернирования, и он переполняется к концу цикла
- Компилятор превращает каждую итерацию в
string.Format, а он медленный - Каждый
+=создаёт новую строку и копирует всё накопленное: O(n²)правильный ответ
Разбор
Строка неизменяема, поэтому += выделяет новую строку длины старой плюс кусок и копирует в неё обе части. Суммарно копируется порядка n²/2 символов, плюс много мусора для GC. StringBuilder держит изменяемый буфер и растит его с удвоением. Пул интернирования тут ни при чём: динамически созданные строки в него не попадают. Блокировок и string.Format тоже нет: компилятор вызывает string.Concat.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.