优化代码以便更快地执行

3 c# string optimization

如何优化以下代码以使其执行得更快?

static void Main(string[] args) 
{
    String a = "Hello ";
    String b = " World! ";
    for (int i=0; i<20000; i++) 
    {
        a = a + b;
    }
    Console.WriteLine(a);
} 
Run Code Online (Sandbox Code Playgroud)

Sam*_*ell 33

StringBuilder文档:

性能注意事项

Concat和AppendFormat方法都将新数据连接到现有的String或StringBuilder对象.String对象并置操作始终从现有字符串和新数据创建新对象.StringBuilder对象维护一个缓冲区以容纳新数据的串联.如果房间可用,新数据将附加到缓冲区的末尾; 否则,分配一个新的较大缓冲区,将原始缓冲区中的数据复制到新缓冲区,然后将新数据附加到新缓冲区.

String或StringBuilder对象的串联操作的性能取决于内存分配发生的频率.字符串连接操作始终分配内存,而StringBuilder连接操作仅在StringBuilder对象缓冲区太小而无法容纳新数据时分配内存.因此,如果连接固定数量的String对象,则String类更适合并置操作.在这种情况下,编译器甚至可以将单个连接操作组合成单个操作.如果连接任意数量的字符串,则StringBuilder对象最好用于连接操作; 例如,如果循环连接随机数量的用户输入字符串.

static void Main(string[] args) {
    String a = "Hello ";
    String b = " World! ";
    StringBuilder result = new StringBuilder(a.Length + b.Length * 20000);
    result.Append(a);
    for (int i=0; i<20000; i++) {
        result.Append(b);
    }
    Console.WriteLine(result.ToString());
} 
Run Code Online (Sandbox Code Playgroud)

  • +1表示实际产生与原始问题相同的输出的正确实现. (2认同)
  • 这是家庭作业,但这里的关键问题是字符串不变性.你不能改变字符串,追加20000会有可怕的表现.所以教师明显的答案是使用字符串生成器来进行连接. (2认同)