StringBuilder作为类成员?

时间:2015-12-10 11:50:19

标签: c# stringbuilder

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

或者在此类操作之前使用新的StringBuidler()

我怀疑如果有StringBuilder准备好在那里使用它会很有效。

1 个答案:

答案 0 :(得分:4)

这是一个有趣的问题,一个是researched

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

但是,没有,几乎没有必要,在大多数情况下可能是个坏主意。线程安全等其他考虑因素通常比过早微优化更重要。

linked article中的以下代码进行了高度人为的性能测试:

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();
    }
}

结果(我自己运行):

  • 重复分配:146.21
  • StringBuilder as field:98.96