9

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

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

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

谢谢。

4

5 回答 5

46

使用StringBuilder

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

当你+=在字符串上使用时,你会不断地创建新的字符串,并且不断地定位越来越大的内存块。这就是为什么操作如此缓慢的原因。

于 2009-11-17T11:22:13.633 回答
14

使用 a StringBuilder,正如@Kobi 所引用的,您仍然可以通过初始化它来提高性能。看来您可以string提前确定最终的大小。

StringBuilder sb = new StringBuilder(7000*2000);
for(int i=0; i< 7000; i++){
   sb.append(2000_char_long_string);
}
return sb.ToString();
于 2009-11-17T11:34:26.677 回答
2

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

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

这是因为,如果不指定,StringBuilder在创建时的默认容量是16。

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

请看我对StringBuilder 和容量的回答?更多细节。

于 2009-11-17T11:36:08.937 回答
1

您应该使用StringBuilder

于 2009-11-17T11:23:05.993 回答
1

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

于 2009-11-17T11:27:01.523 回答