Как что потребление RAM StringBuilder?

 <TeamItem 
  key={team.idTeam}
  strTeamBadge={team.strTeamBadge}
  strTeam={team.strTeam}
  strStadium={team.strStadium}
  goToDetails={() => this.goToDetails(team.idTeam)}
 /> 
 )) 

Ваша функция вызывается при рендеринге компонента, попробуйте использовать функцию стрелки

6
задан Peter Mortensen 12 February 2010 в 09:45
поделиться

5 ответов

Вот хорошее исследование о Конкатенации строк по сравнению с Выделением памяти.

Если можно постараться не конкатенировать, сделайте это!

Это не brainer, если Вы не должны связывать, но хотеть, чтобы Ваш исходный код выглядел хорошим, используйте первый метод. Это будет оптимизировано, как будто это была единственная строка.

Не используйте + = конкатенирующий никогда. Слишком много изменяется, происходят позади сцены, которые не очевидны из моего кода во-первых. Я советую, чтобы скорее использовать Строку. Concat () явно с любой перегрузкой (2 строки, 3 строки, массив строк). Это ясно покажет то, что Ваш код обходится без любых неожиданностей, позволяя себе контролировать эффективность.

Попытайтесь оценить целевой размер StringBuilder.

Чем более точный можно оценить необходимый размер, тем менее временные строки StringBuilder будет иметь для создания для увеличения его внутреннего буфера.

Не используйте Формат () методы, когда производительность будет проблемой.

Слишком много служебное вовлечено в парсинг формата, когда Вы могли создать массив из частей, когда все, что Вы используете, является {x} заменами. Формат () хорош для удобочитаемости, но одна из вещей пойти при сжатии всей возможной производительности из приложения.

6
ответ дан 8 December 2019 в 13:03
поделиться

Каждый раз, когда в StringBuilder заканчивается пространство, он перераспределяет новый буфер дважды размер исходного буфера, копирует старые символы и позволяет старому буферу получить GC'd. Возможно, что Вы просто используете достаточно (назовите это x), таким образом, что 2x больше, чем память, которую Вам разрешают выделить. Можно хотеть определить максимальную длину для строк и передать ее конструктору StringBuilder, таким образом, Вы предварительно выделяете, и Вы не во власти удваивающегося перераспределения.

10
ответ дан 8 December 2019 в 13:03
поделиться

Вам могло бы быть интересно структурой данных веревок. Эта статья: Веревки: Теория и практика объясняют их преимущества. Возможно, существует реализация для.NET.

[Обновление, для ответа на комментарий] это использует меньше памяти? Поисковая память в статье, Вы найдете некоторые подсказки.
В основном, да, несмотря на структуру наверху, потому что это просто добавляет память при необходимости. StringBuilder, при исчерпании старого буфера, должен выделить намного больший (который может уже потратить впустую пустую память), и отбрасывает старый (который будет собран "мусор", но может все еще использовать партию памяти тем временем).

Я не нашел реализацию для.NET, но существует, по крайней мере, реализация C++ (в STL SGI: http://www.sgi.com/tech/stl/Rope.html). Возможно, можно усилить эту реализацию. Отметьте страницу, на которую я ссылаюсь, имеют работу над производительностью памяти.

Обратите внимание, что Веревки не являются средством исправления ко всем проблемам: их полноценность зависит в большой степени, как Вы создаете свои большие строки, и как Вы используете их. Статьи указывают на преимущества и недостатки.

3
ответ дан 8 December 2019 в 13:03
поделиться

Strigbuilder является совершенно хорошим решением проблем памяти, вызванных путем конкатенации строк.

Для ответа на конкретный вопрос Stringbuilder имеет издержки постоянного размера по сравнению с нормальной строкой, где длина строки равна длине выделенного в настоящее время буфера Stringbuilder. Буфер мог потенциально быть дважды размером строки, которая заканчивается, но больше выделений памяти не будет сделано при конкатенации к Stringbuilder, пока буфер не будет заполнен, таким образом, это - действительно отличное решение.

По сравнению со строкой это является выдающимся.

string output = "Test";
output += ", printed on " + datePrinted.ToString();
output += ", verified by " + verificationName;
output += ", number lines: " + numberLines.ToString();

Этот код имеет четыре строки, которые сохранили как литералы в коде, два, которые создаются в методах и один от переменной, но это использует шесть отдельных промежуточных строк, которые становятся длиннее и длиннее. Если этот шаблон будет продолжен, то он увеличит использование памяти на экспоненциальном уровне, пока GC не умрет для чистки его.

1
ответ дан 8 December 2019 в 13:03
поделиться

Я не знаю о точно, шаблон памяти строкового разработчика, но общей строки не является опцией.

При использовании общей строки, каждая конкатенация создает еще несколько строковых объектов и сигнальную ракету потребления памяти, делая сборщик "мусора" названным слишком часто.

string a = "a";

//creates object with a

a += "b"

/creates object with b, creates object with ab, assings object with ab to "a" pointer
-2
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: