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.