首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder作为班级成员?

StringBuilder作为班级成员?
EN

Stack Overflow用户
提问于 2015-12-10 11:50:19
回答 1查看 1.1K关注 0票数 5

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

还是在这样的操作之前使用新的StringBuidler()

我怀疑如果有一个可以在那里使用的StringBuilder,那么它是有效的。

EN

回答 1

Stack Overflow用户

发布于 2015-12-10 12:08:04

这是一个有趣的问题,也是一个研究问题。

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

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

来自链接物品的以下代码进行了高度人为的性能测试:

代码语言:javascript
复制
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字段: 98.96
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34201146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档