C#+ =(加上等于)(加法分配)工作非常慢,当字符串太长时?

时间:2009-11-17 11:20:53

标签: c# string performance assignment-operator

我有一个for循环,我所做的就是这个。

forloop ( loop 7000 times)
{
x += 2000_char_long_string;
}

代码在这个forloop中持续很长时间,可能超过1分钟。我该如何解决这个问题?

感谢。

5 个答案:

答案 0 :(得分:45)

使用StringBuilder

StringBuilder sb = new StringBuilder();
for(int i=0; i< 200; i++){
   sb.append(longString);
}
return sb.ToString();

在字符串上使用+=时,您将继续创建新字符串,并继续查找越来越大的内存块。这就是为什么操作太慢了。

答案 1 :(得分:14)

使用StringBuilder作为@Kobi referenced,您仍然可以通过初始化来提高效果。您似乎可以提前确定string的最终大小。

StringBuilder sb = new StringBuilder(7000*2000);
for(int i=0; i< 7000; i++){
   sb.append(2000_char_long_string);
}
return sb.ToString();

答案 2 :(得分:2)

字符串操作是不可变的。每次stmt x + = 2000_char_long_string时都会创建一个新字符串;被执行。因此,正如Kobi所建议的那样,您应该使用StringBuilder类。

但是,在您的情况下,您应该在StringBuilder构造函数中指定容量。

这是因为,如果未指定,则在创建期间StringBuilder的默认容量为16.

一旦此容量耗尽,它将创建一个新的连续内存位置,将StringBuilder的所有内容复制到新位置并将实例指向新位置。由于您已经知道最终字符串的大致大小(可能是7000 * 2000),因此您可以相应地指定容量。

有关详细信息,请参阅我对StringBuilder and capacity?的回答。

答案 3 :(得分:1)

您应该使用StringBuilder

答案 4 :(得分:1)

C#字符串对象是不可变的,每次更改内容时都会创建新对象并复制新内容。请改用StringBuilder,它是为解决您面临的问题而提供的