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

本文关键字:连接 巨大 字符串 方法 寻找 | 更新日期: 2023-09-27 18:31:56

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

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

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

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

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

但最终我所有的测试图像都比真实的图像小。如何通过更大的图像保持较高的串联速度?

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

使用 System.Text.StringBuilder:

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

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

详细说明@abatishchev的答案:

当你连接字符串时,你

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

用法是这样的:

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

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

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

请注意。

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

这样使用 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");

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