首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >string.concat和StringBuilder一样有效吗?

string.concat和StringBuilder一样有效吗?
EN

Stack Overflow用户
提问于 2018-02-14 10:40:26
回答 2查看 392关注 0票数 1

更新

请看这个问题:Does StringBuilder use more memory than String concatenation?。我相信丹·陶斯回答了我的问题。我想确定的是,他的回答仍然听起来,因为它是2010年?我相信这也回答了我的问题:https://coders-corner.net/2014/08/20/concatenate-strings-in-c-operator-vs-string-concat-vs-stringbuilder/

原始问题

这种方法不能使用C#:

代码语言:javascript
复制
public string getMessage()
{
    string message = "Hello";
    string message += " my";
    string message += " name";
    string message += " is";
    string message += " bert";
    return message;
}

这样做更好:

代码语言:javascript
复制
public string getMessage()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("Hello");
    sb.Append(" my");
    sb.Append(" name");
    sb.Append(" is");
    sb.Append(" Bert");
    return message.ToString();
}

与第二种方法相比,这种方法如何:

代码语言:javascript
复制
public string getMessage()
{
    return string.Concat("Hello",  " my", " name", " is", " Bert");
}

我喜欢第三种方法,因为它只是一行代码。使用第三种方法是否意味着什么?我在这里查看了.NET引用:https://referencesource.microsoft.com/#mscorlib/system/string.cs,8281103e6f23cb5c,特别是带有签名的方法:公共静态字符串连接(params String[]值)。不过,我还是想确认一下?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-14 11:13:10

这取决于你想要什么。如果您要控制2个字符串,那么这将比StringBuilder更快,因为实例化StringBuilder类有一定的开销。另一方面,如果您将100个字符串缩进比StringBuilder类快得多。之所以速度更快,是因为它使用的是缓冲区,而不是普通的字符串contatenation(字符串是不可变的)。

string.Concat()内部不使用StringBuilder,因此这个假设是错误的。

尝试查看string.Concat重载,您可能会更好地了解何时使用string.Concat和何时使用StringBuilder。您会注意到有几个过载(确切地说是10个,但让我们看看这5个)。

代码语言:javascript
复制
string.Concat(arg0)
string.Concat(arg0, arg1)
string.Concat(arg0, arg1, arg2)
string.Concat(arg0, arg1, arg2, arg3)
string.Concat(params string[])

如果您在基准测试中使用所有这些方法以及StringBuilder,您会注意到,在大约4个字符串连接的某个地方,StringBuilder将起带头作用。这是因为前4个string.Concat()方法比最后一个方法更优化,后者只需要多少个参数。

有趣的是,如果您要添加另一个度量系列,但是这次是用容量实例化它的StringBuilder,而不是StringBuilder带头,因为当StringBuilder达到当前的容量上限时会有开销。

编辑:我找到了我的基准测试结果(这是2011年的一篇论文)。为了可靠性目的,完成了100,000次。轴X是用于连接的字符串数,而轴Y是持续时间。

票数 1
EN

Stack Overflow用户

发布于 2018-02-14 11:07:45

StringBuilder是如此的优化。这是我的考验:

代码语言:javascript
复制
static void ConcatenateWithOperator()
{
    string txt = string.Empty;

    for (int i = 0; i < 1000; i++)
    {
        txt += new string('x', i);
    }
}

static void ConcatenateWithStringBuilder()
{
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < 1000; i++)
    {
        builder.Append(new string('x', i));
    }

    string result = builder.ToString();
}

static void ConcatenateWithConcat()
{
    string txt = string.Empty;

    for (int i = 0; i < 1000; i++)
    {
        txt = string.Concat(txt, new string('x', i));
    }
}

static void ConcatenateWithOperator2()
{
    for (int i = 0; i < 1000; i++)
    {
        string result = new string('x', i) + new string('x', i);
    }
}

static void ConcatenateWithStringBuilder2()
{
    for (int i = 0; i < 1000; i++)
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(new string('x', i));
        builder.Append(new string('x', i));
        string result = builder.ToString();
    }
}

    DateTime start1 = DateTime.Now;
    ConcatenateWithOperator();
    Console.WriteLine((DateTime.Now - start1).TotalSeconds);

    DateTime start2 = DateTime.Now;
    ConcatenateWithStringBuilder();
    Console.WriteLine((DateTime.Now - start2).TotalSeconds);

    DateTime start3 = DateTime.Now;
    ConcatenateWithConcat();
    Console.WriteLine((DateTime.Now - start3).TotalSeconds);

    DateTime start4 = DateTime.Now;
    ConcatenateWithOperator2();
    Console.WriteLine((DateTime.Now - start4).TotalSeconds);

    DateTime start5 = DateTime.Now;
    ConcatenateWithStringBuilder2();
    Console.WriteLine((DateTime.Now - start5).TotalSeconds);

其结果是:

代码语言:javascript
复制
0,3087516  // many strings concatenated with + operator
0,0030022  // many strings concatenated with StringBuilder
0,1941643  // many strings concatenated with Concat
0,0040039  // two strings concatenated with + operator
0,004003   // two strings concatenated with StringBuilder

因此,只有当您希望连接少量字符串时,+运算符作为StringBuilder才是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48785118

复制
相关文章

相似问题

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