0

私の C# (.NET 2.0) アプリケーションには、容量が 2.5MB の StringBuilder 変数があります。明らかに、このような大きなバッファーがいっぱいになるたびに、そのような大きなバッファーをより大きなバッファー スペースにコピーしたくはありません。とにかく、その時点までにバッファ内に非常に多くのデータがあるため、古いデータを削除することは実行可能なオプションです。私がこれをどのように行っているかについて明らかな問題を誰かが見ることができますか (つまり、私が解決しているよりも多くのパフォーマンスの問題を引き起こしていますか)、または問題ないように見えますか?

  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

4 に答える 4

1

これを実際にどのように使用していStringBuilderますか?そこから何かを削除しているという事実は、それを一種のバッファーとして実際に使用していることを示唆しています。

このように呼び出すRemoveと、すでにバッファーの後半が最初の半分にコピーされているため、まだ多くのコピーを行っていることに注意してください。

を使用する代わりにStringBuilder、文字列の循環バッファーを使用できますか? これにより、古いデータを破棄して新しい文字列に置き換えることがほぼ自由になります。文字列全体を追加し、場合によっては (おそらく) 全体を単一の文字列に変換する以外に、ビルダーで何かする必要がありますか?

于 2010-05-25T13:39:39.577 に答える
1

「...後で複数行のテキスト ボックスにコピーする ASCII テキストをバッファリングするために使用されています..」

~200kb を超えると、テキストボックスは発作を起こします...失敗することはありません...しかし、そのパフォーマンスは石のように低下​​します。ある種の文字列コレクションを使用するコントロールは、より良いアイデアかもしれません...おそらくListBox ?...疑似例:

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

「..更新する必要があります(1秒間に数千回ではないにしても、数百回)再描画します..」

Ui の更新レートが 50hz を超えることはあまりありません...バッファ構造に影響を与える可能性があります。

于 2010-05-25T14:00:44.090 に答える
0

アプリケーション シーケンスの 1 回のパス (およびいくつかのパス) に十分なテキストを格納するのに十分な大きさのバッファーを割り当てることで、発生していたパフォーマンスの問題を解決することができました。シーケンスが (再) 開始されるたびに、バッファーはクリアされます。

于 2010-07-14T20:03:22.420 に答える
0

代わりに stringstream または memorystream が必要ですか? 必要に応じて、ストリームに書き込み、ストリームから読み取ることができます。

StringBuilder をそのように大きくすることにはあらゆる種類の問題がありますが、そのうちの少なくとも 1 つは、それが大きなオブジェクト ヒープに置かれるということです。

于 2010-05-25T13:45:32.270 に答える