StringBuilder или + =
Я получаю около 5 сообщений в секунду. Каждая из них имеет строку, которую я соединяю с главной строкой, содержащей все полученные сообщения.
string _masterText = "";
public void AddNewMessage(string text) // this is going to be call at least 5 times/second
{
_masterText += text;
}
Согласен ли это с этим? или я должен использовать вместо StringBuilder, например:
StringBuilder _masterText = new StringBuilder();
public void AddNewMessage(string text) // this is going to be call at least 5 times/second
{
_masterText.Append(text);
}
Спасибо
Ответы
Ответ 1
StringBuilder обычно считается лучшим вариантом, но в этом случае я бы не использовал .
Даже с StringBuilder, с этой скоростью базовый буфер символов скоро будет достаточно большим, чтобы застрять в кучке больших объектов. Это вызовет проблемы для работоспособности приложения, которое должно работать некоторое время.
Вместо этого я использую System.Collections.Generic.List<string>
и просто вызываю его .Add()
для каждого нового сообщения. В зависимости от того, что вы делаете с этими сообщениями, вы также можете найти другой тип коллекции более подходящим (возможно, Queue<string>
), но это направление, в котором вы должны идти. Используя коллекцию, память, используемая каждой отдельной строкой, не будет учитываться в размере объекта коллекции. Вместо этого каждая строка добавит только несколько байтов для ссылки. Это займет намного больше времени, чтобы столкнуться с проблемами с уплотнением кучи больших объектов.
Если у вас все еще есть проблемы после переключения в коллекцию, вы можете использовать поток и записывать строки на диск. Таким образом, у вас никогда не будет больше одной строки в ОЗУ за раз. Теперь единственный способ, с которым вы столкнулись, состоит в том, что отдельные строки имеют размер 85000 байт или больше.
Ответ 2
Помните, что класс String
неизменен. Невозможно изменить строку. Когда вы выполняете "конкатенирование" строк, вы действительно создаете новую строку и копируете содержимое исходной строки в нее, а затем добавляете содержимое своей новой строки.
Это начинает очень быстро использовать память, если вы добавляете большие строки.
Ответ 3
Каждые 200 мс не очень опросный опрос, несмотря на то, что строковый сервер всегда лучше.
Ответ 4
Если вы хотите прочитать, я думаю, что обсуждение в http://dotnetperls.com/stringbuilder-1 действительно полезно. Проверьте ссылки на реальные показатели скорости и использования памяти.
Кроме того, ознакомьтесь с обсуждением Джоэл Спольски " Shlemeil the Painter Algorithm". Хотя он говорит о функции C strcat
, этот принцип применяется к оператору С# plus по строкам. Кроме того, это хорошо для смеха.
В общем, я рекомендую StringBuilder, если вы выполняете операцию добавления быстро или со многими большими строками.
Ответ 5
StringBuilder - ваш друг!
Ответ 6
Это зависит от сценария. Несомненно, это быстрее добавить с общим списком в сравнении с объектом stringbuilder. Но во время извлечения данных из общего списка он будет намного медленнее по сравнению с объектом stringbuilder.
stringbuilder быстро вернется с помощью _masterText.ToString(), но с общим списком вам может потребоваться вывести значение с помощью итерации. И это будет дорогостоящий процесс, такой как: -
for (int x = 0; x < 100; x++)
{
Label3.Text += gen_list[x];
}
Или вы можете попробовать
Label3.Text = string.Join("", gen_list.ToArray());
то операция поиска будет более медленной и дорогостоящей, и вы можете легко заметить всплеск CPU.