2

我正在制作一个将图像转换为文本RRR GGG BBB 字符串数组的应用程序。

它适用于小图像非常快,但是当输入图像的像素数非常高时,应用程序会逐渐变慢。

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

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

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

但最终我所有的测试图像都比真实图像要小。如何使用更大的图像保持高速连接速度?

4

6 回答 6

8

使用System.Text.StringBuilder

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

string result = sb.ToString();

此类专为快速字符串连接而设计。我不知道有什么比它更快(对于一般情况)。

于 2012-04-23T12:02:00.680 回答
4

详细说明@abatishchev 的回答:

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

用法是这样的:

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

string myString = sb.ToString();
于 2012-04-23T12:05:16.257 回答
3

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

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

请注意。

于 2012-04-23T12:11:48.407 回答
2

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

于 2012-04-23T12:03:14.513 回答
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");
于 2012-04-23T12:05:57.277 回答
0

StringBuilder 设计用于处理庞大而复杂的字符串。

于 2012-04-23T12:38:45.467 回答