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您可以使用字符串的循环缓冲区而不是使用a 吗?这将使丢弃旧数据并用新字符串替换它几乎是自由的。除了附加整个字符串并偶尔(可能)将整个内容转换为单个字符串之外,您是否需要对构建器执行任何操作?

于 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();
  } 
}

“..需要更新(每秒数百次,如果不是数千次)并重绘..”

您的 Ui 更新率不会合理地优于 ~50hz...可能会对您的缓冲区结构产生影响。

于 2010-05-25T14:00:44.090 回答
0

您可能想要一个字符串流或内存流吗?您可以根据需要写入流并从中读取。

我可以看到让你的 StringBuilder 像这样变大的各种问题,其中最重要的是它会坐在大对象堆上。

于 2010-05-25T13:45:32.270 回答
0

我能够通过分配一个足够大的缓冲区来解决我遇到的性能问题,以存储足够的文本,以便单次通过应用程序序列(然后是一些)。每次(重新)启动序列时,缓冲区都会被清除。

于 2010-07-14T20:03:22.420 回答