Выбор ответа Junior Строки спрашивают часто обновлено

Почему += в цикле медленно

Вопрос

Почему склейка result += part в цикле на 100 000 итераций работает медленно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Каждый += создаёт новую строку и копирует всё накопленное: O(n²). Строка неизменяема, поэтому += выделяет новую строку длины старой плюс кусок и копирует в неё обе части.

Варианты ответа

  1. Оператор += для строк блокирует поток на время копирования буфера
  2. Строки попадают в пул интернирования, и он переполняется к концу цикла
  3. Компилятор превращает каждую итерацию в string.Format, а он медленный
  4. Каждый += создаёт новую строку и копирует всё накопленное: O(n²)правильный ответ

Разбор

Строка неизменяема, поэтому += выделяет новую строку длины старой плюс кусок и копирует в неё обе части. Суммарно копируется порядка n²/2 символов, плюс много мусора для GC. StringBuilder держит изменяемый буфер и растит его с удвоением. Пул интернирования тут ни при чём: динамически созданные строки в него не попадают. Блокировок и string.Format тоже нет: компилятор вызывает string.Concat.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.