寻找更快的方法来连接巨大的字符串

时间:2012-04-23 12:01:25

标签: c# .net string-concatenation

我正在创建一个将图片转换为文本RRR GGG BBB 字符串数组的应用。

对于小图像,它的工作速度非常快,但当输入图像的像素数非常高时,应用程序会逐渐减慢。

应用程序运行x,y循环遍历输入图像的所有像素,扫描每个像素并将其RGB格式的值添加到最终字符串中,该字符串将在扫描整个图像后保存为文本。

在内置分析器的帮助下,我发现System.String.Concat(string,string)花费的时间越多,最终字符串越大。

然后我尝试创建一个临时字符串,它将保存1行计算结果,然后在进入下一行之前,将其添加到最终字符串中。现在它的工作速度提高了大约十倍,但仍然接近最终,性能下降。

但最后我的所有测试图像都比实际图像要小。如何将连接速度提高到更大的图像?

6 个答案:

答案 0 :(得分:7)

使用System.Text.StringBuilder

var sb = new StringBuilder();
sb.Append(r);
sb.Append(g);
sb.Append(b);

string result = sb.ToString();

此类专为快速字符串连接而设计。我不知道更快(一般情况下)它。

答案 1 :(得分:4)

详细说明@ abatishchev的回答:

当你连接字符串时,你实际上是为每个连接创建一个新的字符串实例,所以你总是要分配数千(数百万?)个小字符串。 但是,StringBuilder使用内部字符缓冲区来管理字符串,并避免这些频繁的分配。

用法是这样的:

StringBuilder sb = new StringBuilder();
foreach (Pixel pixel in myPixels)
{
    sb.Append(ConvertToString(pixel));
}

string myString = sb.ToString();

答案 2 :(得分:3)

正如大家所说,是的,使用StringBuilder。

<强> BUT

如果您已经以某些集合的形式连接字符串,String.Join()被证明更快。

请注意。

答案 3 :(得分:2)

使用String.Join("", myarray);

答案 4 :(得分:0)

像这样使用StringBuilder:

//add reference
using System.Text

//create string builder
StringBuilder sb = new StringBuilder();
//add items to it
sb.Append("some text");
sb.Append(" more text");

答案 5 :(得分:0)

StringBuilder旨在处理庞大而复杂的字符串。