我正在创建一个将图片转换为文本RRR GGG BBB
字符串数组的应用。
对于小图像,它的工作速度非常快,但当输入图像的像素数非常高时,应用程序会逐渐减慢。
应用程序运行x,y
循环遍历输入图像的所有像素,扫描每个像素并将其RGB格式的值添加到最终字符串中,该字符串将在扫描整个图像后保存为文本。
在内置分析器的帮助下,我发现System.String.Concat(string,string)
花费的时间越多,最终字符串越大。
然后我尝试创建一个临时字符串,它将保存1行计算结果,然后在进入下一行之前,将其添加到最终字符串中。现在它的工作速度提高了大约十倍,但仍然接近最终,性能下降。
但最后我的所有测试图像都比实际图像要小。如何将连接速度提高到更大的图像?
答案 0 :(得分:7)
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旨在处理庞大而复杂的字符串。