StringBuilder 作为类成员?

Che*_*ing 5 c# stringbuilder

创建StringBuilder类的成员并在要进行字符串连接时在类方法中使用它是否有效(或必要?)?

或者只是StringBuidler()在此类操作之前使用 new ?

我怀疑如果那里有StringBuilder准备使用它是有效的。

Bal*_*ick 4

这是一个有趣的问题,并且已经被研究过

答案是,是的在极端的测试条件下,共享单个实例并重用它比StringBuilder每次创建一个新实例更有效。

但是,,这几乎没有必要,而且在大多数情况下可能是一个坏主意。其他考虑因素(例如线程安全)通常比过早进行微优化更重要。

链接文章中的以下代码进行了高度人为的性能测试:

using System;
using System.Diagnostics;
using System.Text;

class Program
{
    static string Method1()
    {
        StringBuilder builder = new StringBuilder();
        foreach (string value in _array)
            builder.Append(value);
        return builder.ToString();
    }

    static StringBuilder _builder = new StringBuilder();

    static string Method2()
    {
        StringBuilder builder = _builder;
        builder.Clear();
        foreach (string value in _array)
            builder.Append(value);
        return builder.ToString();
    }

    static string[] _array = { "dot", "net", "perls", "string", "array" };
    const int _max = 1000000;
    static void Main()
    {
        Method1();
        Method2();

        // Version 1: use new StringBuilder each time.
        var s1 = Stopwatch.StartNew();
        for (int i = 0; i < _max; i++)
        {
            Method1();
        }
        s1.Stop();

        // Version 2: reuse a single StringBuilder instance.
        var s2 = Stopwatch.StartNew();
        for (int i = 0; i < _max; i++)
        {
            Method2();
        }
        s2.Stop();
        Console.WriteLine(s1.Elapsed.TotalMilliseconds);
        Console.WriteLine(s2.Elapsed.TotalMilliseconds);
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果(我自己刚刚运行过):

  • 重复分配:146.21
  • StringBuilder 作为字段:98.96

  • 这是与实践无关的微观优化问题之一。大多数时候,其他参数应该很重要,例如可读性、可维护性、(线程)安全性、可访问性、封装性、可重用性。此外,通常还有其他可以改进的地方。我不认为有理由调用使用大循环数百万次的方法。我可以使用带有更大循环计数器的单个循环(例如)。 (3认同)