寻找更快的方法来连接巨大的字符串
本文关键字:连接 巨大 字符串 方法 寻找 | 更新日期: 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旨在处理庞大而复杂的字符串。