我有一个for循环,我所做的就是这个。
forloop ( loop 7000 times)
{
x += 2000_char_long_string;
}
代码在这个forloop中持续很长时间,可能超过1分钟。我该如何解决这个问题?
感谢。
答案 0 :(得分:45)
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,它是为解决您面临的问题而提供的