C# string.concat是否与StringBuilder一样高效?

C# string.concat是否与StringBuilder一样高效?,c#,C#,更新 请看这个问题:。我相信Dan Taos回答了我的问题。我想确保他的答案仍然是正确的,因为日期是2010年?我相信这也回答了我的问题: 原始问题 这种方法不赞成使用C#: 这样更好: public string getMessage() { StringBuilder sb = new StringBuilder(); sb.Append("Hello"); sb.Append(" my"); sb.Append(" name"); sb.Append

更新

请看这个问题:。我相信Dan Taos回答了我的问题。我想确保他的答案仍然是正确的,因为日期是2010年?我相信这也回答了我的问题:

原始问题

这种方法不赞成使用C#:

这样更好:

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();
}
这种方法与第二种方法相比如何:

public string getMessage()
{
    return string.Concat("Hello",  " my", " name", " is", " Bert");
}

我喜欢第三种方法,因为它只是一行代码。使用第三种方法有什么影响吗?我在这里查看了.NET引用:特别是带有签名的方法:publicstaticstringconcat(paramsstring[]values)。不过,我还是想确认一下?

StringBuilder经过了如此多的优化。这是我的测试:

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

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

这取决于您想要什么。如果您的字符串比我想象的多,那么这将比StringBuilder快,因为在实例化StringBuilder类时会有一定的开销。 另一方面,如果您连续使用100个字符串,则StringBuilder类的速度要快得多。它之所以更快,是因为它使用了缓冲区而不是普通的字符串重叠(字符串是不可变的)

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

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

如果您将所有这些方法与StringBuilder一起使用,那么您会注意到,大约有4个StringContateNations StringBuilder将起到带头作用。这是因为前4个string.Concat()方法比最后一个方法更优化,后者只需要根据需要获取多少个参数

有趣的是,如果您想添加另一个测量系列,但这次对于StringBuilder,您将使用容量对其进行实例化,那么StringBuilder将带头,因为当StringBuilder达到其当前容量上限时,会产生开销

编辑: 我找到了我的基准测试结果(这是2011年的一篇论文)。为了可靠性,这项工作进行了100000次。X轴是连续中使用的字符串数,Y轴是持续时间


您错过了
返回“Hello”+“my”+“name”+“is”+“Bert”
这等于一行中的第一种方法这可能会帮助您相关:除非多次调用
getMessage
,否则这些方法在性能方面没有实质性的不同,因为您连接的字符串数量是恒定的。当您事先不知道要连接的字符串时,使用
StringBuilder
会产生很大的影响,在这种情况下,使用
Concat
通常是不可能或不实用的。如果你确实知道你想要什么字符串,考虑使用逐字字符串(@)或只是普通的<代码> +/COD>,这样编译器就可以在没有开销的情况下为你处理事情。请在这里给出具体的问题。您是只询问所示的示例,还是一般意义上的询问?我这样问是因为对代码中字符串部分的数量进行微小的调整将大大改变“哪一个是最快的”答案,这意味着对于这样一个广泛的问题,唯一真正通用的答案是“它取决于”。第三个选项是否会创建五个单独的字符串(像第一个选项一样)我不明白你的问题。第一段代码在内存中创建了五个字符串。第三种方法只在内存中创建一个字符串(在调用tostring之后)…我不知道您引用的是哪个片段。我只是在一行中列出了5种方法。请看这个问题:。我相信Dan Taos回答了我的问题。我想确保他的答案仍然是正确的,因为日期是2010年。请看这个问题:。我相信Dan Taos回答了我的问题。我想确保他的答案仍然是正确的,因为日期是2010年。
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);
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
string.Concat(arg0)
string.Concat(arg0, arg1)
string.Concat(arg0, arg1, arg2)
string.Concat(arg0, arg1, arg2, arg3)
string.Concat(params string[])