字符串连接方式
- str1 + str2
- $”{p}” (C#7.0新增)
- String.Format
- String.Concat
- StringBuilder
测试方法
- 使用每种方法分别连接两个字符串常量和两个字符串变量
- 使用每种方法分别连接10个字符串常量
- 循环10000000次并计时
结论
- 在处理少量字符串链接时,推荐用 + 易读性好,性能损失不大。
- Concat 性能最优, $”{p}”与Format 性能最差。。
- 字符串常量会在编译时链接成一个字符串,字符串变量在运行时链接。
- 除了+,其他方法使用字符串常量和变量相差很小,可以忽略。
- string builder 在固定数量的常量或变量链接时并不占优。
测试结果
测试1 两个字符串
- Plus 1: 47ms
- Plus 2: 697ms
- $”{p}” 1: 3576ms
- Format 1-1: 2866ms
- Format 1-2: 2753ms
- Format 2-1: 3303ms
- Format 2-2: 3271ms
- Concat 1: 502ms
- Concat 2: 423ms
- String builder 1: 994ms
- String builder 2: 902ms测试2 两个字符串
- Plus 1: 49ms
- Plus 2: 802ms
- $”{p}” 1: 3985ms
- Format 1-1: 3016ms
- Format 1-2: 2911ms
- Format 2-1: 3443ms
- Format 2-2: 3678ms
- Concat 1: 485ms
- Concat 2: 692ms
- String builder 1: 1222ms
- String builder 2: 1251ms测试3 十个字符串
- Link ten short strings
- Plus 1: 60ms
- Plus 2: 4135ms
- $ 1: 10524ms
- Format 1: 10641ms
- Concat 1: 3614ms
- String builder 1: 5279ms测试4 十个字符串
- Link ten short strings
- Plus 1: 46ms
- Plus 2: 3939ms
- $ 1: 11097ms
- Format 1: 10589ms
- Concat 1: 3647ms
- String builder 1: 5145ms
Code
var str = "";
var sw = new System.Diagnostics.Stopwatch();
var s1 = "p2 i1:";
var s2 = ", i2:";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = s1 + s2;
}
sw.Stop();
Console.WriteLine("Plus 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
s1 = "$1 i1:";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = $"{s1}{s2}";
}
sw.Stop();
Console.WriteLine("$ 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Format("f1 i1:{0}", ", i2:");
}
sw.Stop();
Console.WriteLine("Format 1-1: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Format("f3 i1:{0}", s2);
}
sw.Stop();
Console.WriteLine("Format 1-2: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Format("{0}{1}", "f2 i1:", ", i2:");
}
sw.Stop();
Console.WriteLine("Format 2-1: " + sw.ElapsedMilliseconds.ToString() + "ms");
s1 = "f4 i1:";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Format("{0}{1}", s1, s2);
}
sw.Stop();
Console.WriteLine("Format 2-2: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Concat("c1 i1:", ", i2:");
}
sw.Stop();
Console.WriteLine("Concat 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
s1 = "c2 i1:";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Concat(s1, s2);
}
sw.Stop();
Console.WriteLine("Concat 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
var builder = new System.Text.StringBuilder();
builder.Append("s1 i1:");
builder.Append(", i2:");
str = builder.ToString();
}
sw.Stop();
Console.WriteLine("String builder 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
s1 = "s2 i1:";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
var builder = new System.Text.StringBuilder();
builder.Append(s1);
builder.Append(s2);
str = builder.ToString();
}
sw.Stop();
Console.WriteLine("String builder 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
Console.WriteLine("Link ten short strings");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = "p2 i1:" + ", i2:" + ", i3:" + ",i4:" + ", i5:" + ", i6:" + ", i7:" + ", i8:" + ", i9:" + ", i10:";
}
sw.Stop();
Console.WriteLine("Plus 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
s1 = "p2 i1:";
var s3 = ", i3";
var s4 = ", i4";
var s5 = ", i5";
var s6 = ", i6";
var s7 = ", i7";
var s8 = ", i8";
var s9 = ", i9";
var s10 = ", i10";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
}
sw.Stop();
Console.WriteLine("Plus 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
s1 = "$1 i1:";
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = $"{s1}{s2}{s3}{s4}{s5}{s6}{s7}{s8}{s9}{s10}";
}
sw.Stop();
Console.WriteLine("$ 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", "f2 i1:", ", i2:", ", i3:", ",i4:", ", i5:", ", i6:", ", i7:", ", i8:", ", i9:", ", i10:");
}
sw.Stop();
Console.WriteLine("Format 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
str = string.Concat("c1 i1:", ", i2:", ", i3:", ",i4:", ", i5:", ", i6:", ", i7:", ", i8:", ", i9:", ", i10:");
}
sw.Stop();
Console.WriteLine("Concat 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
{
var builder = new System.Text.StringBuilder();
builder.Append("s1 i1:");
builder.Append(", i2:");
builder.Append(", i3:");
builder.Append(", i4:");
builder.Append(", i5:");
builder.Append(", i6:");
builder.Append(", i7:");
builder.Append(", i8:");
builder.Append(", i9:");
builder.Append(", i10:");
str = builder.ToString();
}
sw.Stop();
Console.WriteLine("String builder 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
Console.ReadKey();