Управление ресурсами StringBuilder - PullRequest
0 голосов
/ 25 мая 2010

В моем приложении на C # (.NET 2.0) есть переменная StringBuilder объемом 2,5 МБ. Очевидно, я не хочу копировать такой большой буфер в большее пространство буфера каждый раз, когда он заполняется. К этому моменту в буфере в любом случае так много данных, что удаление старых данных является приемлемым вариантом. Может ли кто-нибудь увидеть какие-либо очевидные проблемы с тем, как я это делаю (т.е. я представляю больше проблем с производительностью, чем решаю), или все выглядит хорошо?

  tText_c = new StringBuilder(2500000, 2500000);

  private void AppendToText(string text)
  {
     if (tText_c.Length * 100 / tText_c.Capacity > 95)
     {
        tText_c.Remove(0, tText_c.Length / 2);
     }

     tText_c.Append(text);
  }

РЕДАКТИРОВАТЬ: Дополнительная информация:

В этом приложении новые данные принимаются очень быстро (порядка миллисекунд) через последовательное соединение. Я не хочу заполнять многострочное текстовое поле этой новой информацией так часто, потому что это снижает производительность приложения, поэтому я сохраняю ее в StringBuilder. Время от времени приложение копирует содержимое StringBuilder в текстовое поле и стирает содержимое StringBuilder.

Ответы [ 4 ]

1 голос
/ 25 мая 2010

"... используется для буферизации текста ASCII для последующего копирования в многострочное текстовое поле .."

Ваше текстовое поле будет иметь захват, когда вы преодолеете ~ 200 КБ ... оно не подведет ... но его производительность упадет, как камень. Лучше было бы использовать элемент управления, который использует коллекцию строк какого-то рода ... может быть, ListBox? ... псевдо-пример:

public void AddText(string text){
  ListBox.items.add(text);
  if(ListBox.items.count > 4096){
    ListBox.items[0].remove();
  } 
}

".. нужно обновить (сотни, если не тысячи раз в секунду) и перерисовать .."

Ваша частота обновления пользовательского интерфейса не будет лучше, чем ~ 50 Гц ... может повлиять на ваши структуры буфера.

1 голос
/ 25 мая 2010

Как вы на самом деле используете это StringBuilder? Тот факт, что вы удаляете из него что-то, говорит о том, что вы действительно используете его в качестве буфера.

Обратите внимание, что вызов Remove, подобный этому, уже будет копировать вторую половину буфера в первую, так что вы все еще делаете много копий.

Вместо StringBuilder, не могли бы вы использовать циклический буфер строк? Это сделало бы почти свободным отбрасывать старые данные и заменять их новыми строками. Вам нужно что-то делать с компоновщиком, кроме добавления целых строк и иногда (предположительно) преобразования всего этого в одну строку?

0 голосов
/ 15 июля 2010

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

0 голосов
/ 25 мая 2010

Вы хотите вместо этого поток строк или память? Вы можете писать в поток и читать из него по мере необходимости.

Я вижу все виды проблем, когда ваш StringBuilder становится таким большим, не в последнюю очередь то, что он будет сидеть на куче больших объектов.

...