更新
请参阅此问题:Does StringBuilder use more memory than String concatenation?。我相信Dan Taos'回答我的问题。我想确保他的答案仍然是正确的,因为它是2010年的日期?我相信这也回答了我的问题:https://coders-corner.net/2014/08/20/concatenate-strings-in-c-operator-vs-string-concat-vs-stringbuilder/
原始问题
这种方法在使用C#时不赞成:
public string getMessage()
{
string message = "Hello";
string message += " my";
string message += " name";
string message += " is";
string message += " bert";
return message;
}
这样更好:
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引用:https://referencesource.microsoft.com/#mscorlib/system/string.cs,8281103e6f23cb5c,特别是带签名的方法:public static String Concat(params String [] values)。但是,我还想确认一下吗?
答案 0 :(得分:1)
这取决于你想要什么。如果你连接2个字符串而不是我想这会比StringBuilder更快,因为实例化StringBuilder类会有一定的开销。 另一方面,如果你连续100个字符串比StringBuilder类更快。它更快的原因是它使用缓冲区而不是正常的字符串连接(字符串是不可变的)。
string.Concat()在内部不使用StringBuilder,因此这个假设是错误的。
尝试查看string.Concat重载,您可能会更好地了解何时使用string.Concat以及何时使用StringBuilder。您会注意到有几个重载(确切地说是10个但是让我们看看这5个)。
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 :(得分:0)
StringBuilder是如此优化。这是我的考验:
implementation 'com.android.volley:volley:1.1.0'
结果:
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。