Почему добавление строки повлияет на память и производительность системы?
Нить
Когда-то, когда мы работали с Java, нам часто говорили, что нужно использовать StringBuilder и добавлять при добавлении строк вместо добавления String. Причина в том, что String неизменяем; его значение не меняется. При добавлении строки мы создаем новую строку в памяти. StringBuilder является изменяемым, поэтому, когда мы используем добавление, его значение изменяется, а не создается новая строка. Поэтому использование StringBuilder сэкономит память и будет работать быстрее.
Не верите, пожалуйста, смотрите код 2 ниже. Код, использующий StringBuilder, выполняется всего 4 мс, а код, использующий String, — 4828 мс (Источник).
Однако задумывались ли мы когда-нибудь, почему сложение строк происходит медленно или нет? Давайте прочитаем статью и узнаем.
Конкатенация строк, в чем проблема?
Оставим в стороне величественные новые технологии, массивные фреймворки, волшебные языки. Когда-то пользовался DevC, тоже работал с байтами и памятью. Да, знание байтов и памяти — это основа вашей системы знаний.
Как C хранит строку: строка представляет собой массив байтов, последний символ которого является нулевым символом. С таким хранилищем, чтобы узнать длину строки, мы должны запустить цикл, начиная с указателя, содержащего первый байт, до тех пор, пока не встретится нулевой символ. Ниже представлена версия функции strcat, функции сложения строк в C.
Давайте учиться вместе. В первой строке код будет выполняться с самого начала, пока не встретит последний нулевой символ строки назначения, затем он скопирует каждый байт строки src и dest. Два цикла, сложность всего O(n), ничего страшного ?? Однако, когда мы добавляем строки много раз, как насчет длинных строк?
При каждом вызове strcat цикл будет выполняться от начала до конца; чем длиннее строка, тем дольше работает цикл. Пока струна не станет длинной, добавление струны происходит очень тяжело и медленно.
Чем длиннее исходная строка, тем дольше должен работать цикл. Поэтому для решения этой проблемы была создана еще одна версия функции strcat:
С этой нотацией после добавления строки мы возвращаем последнюю позицию указателя. При каждом добавлении цикл проходит от возвращенного указателя до конца строки src, больше не повторяясь, как исходный алгоритм.
Вывод
Долгое изучение низкоуровневых концепций/языков — это неплохо. К счастью, мы используем C#, Java освобождает память, и есть довольно много библиотек для поддержки. Многие врачи до сих пор пишут на С, С++, доступ к памяти вручную — это очень экстремально (Экстремально, но высокая зарплата). Однако, если бы я был тем, кто написал код, в 90% случаев я бы все равно использовал String или String. Формат вместо StringBuilder!! Почему??