字符串拼接的性能测试
字符串的拼接是各种性能文章里最常说的优化内容。大体上是如果拼接的字符串比较多的时候,需要用StringBuilder来进行操作。那么,多少个字符串组成的字符串用StringBuilder效率会高呢?
本次测试一共使用了4种拼接方式
1.连接运算符(+)
2.string.UseConcat 方法
3.string.Formatt 方法
4.StringBuilder
初始化代码里
cLen 是测试字符串的数量
strLen 是字符串的长度
int cLen = 3;
string[] strLines;
string format = "";
public StringConcatBase(int cLen = 3, int strLen = 10)
{
this.cLen = cLen;
strLines = new string[cLen];
for (var i = 0;i < cLen; i++)
{
for (var j = 0; j < strLen; j++)
strLines[i] += i.ToString();
}
for(var i =0;i < cLen; i++)
{
format += "{" + i + "}";
}
}
测试方法里,请暂时忽略掉循环的因素吧,因为不用循环,没法对字符串数量做变量处理
[Benchmark]
public string UseOperator()
{
string s = string.Empty;
for (var i = 0; i < cLen; i++)
s += strLines[i];
return s;
}
[Benchmark]
public string UseConcat()
{
var s = string.Concat(strLines);
return s;
}
[Benchmark]
public string UseStringFormat()
{
var s = string.Format(format, strLines);
return s;
}
[Benchmark]
public string UseStringBuild()
{
StringBuilder sb = new StringBuilder();
for (var i = 0; i < cLen; i++)
{
sb.Append(strLines[i]);
}
var s = sb.ToString();
return s;
}
[Benchmark]
public string UseStringBuild1024()
{
StringBuilder sb = new StringBuilder(1024);
for (var i = 0; i < cLen; i++)
{
sb.Append(strLines[i]);
}
var s = sb.ToString();
return s;
}
测试环境:
BenchmarkDotNet=v0.11.0, OS=Windows 7 SP1 (6.1.7601.0)
Intel Core i5-4590 CPU 3.30GHz (Max: 2.57GHz) (Haswell), 1 CPU, 4 logical and 4 physical cores
Frequency=3215410 Hz, Resolution=311.0023 ns, Timer=TSC
.NET Core SDK=2.1.300
[Host] : .NET Core 2.1.0 (CoreCLR 4.6.26515.07, CoreFX 4.6.26515.06), 64bit RyuJIT
DefaultJob : .NET Core 2.1.0 (CoreCLR 4.6.26515.07, CoreFX 4.6.26515.06), 64bit RyuJIT
让我们看看结果吧
method | 2 | 3 | 5 | 10 | 20 |
---|---|---|---|---|---|
UseOperator | 0.3145 ns | 0.1823 ns | 0.4274 ns | 2.2749 ns | 4.509 ns |
UseConcat | 0.1612 ns | 0.2653 ns | 0.2453 ns | 0.2716 ns | 1.032 ns |
UseStringFormat | 1.0381 ns | 0.6462 ns | 1.5659 ns | 1.7415 ns | 5.442 ns |
UseStringBuilder | 0.2421 ns | 0.3860 ns | 0.8676 ns | 1.4444 ns | 1.101 ns |
UseStringBuilder1024 | 0.6012 ns | 1.6615 ns | 0.8669 ns | 1.0780 ns | 1.939 ns |
| | | | | | |||
UseOperator | 1.95x | 1.00x | 1.74x | 8.38x | 4.37x |
UseConcat | 1.00x | 1.46x | 1.00x | 1.00x | 1.00x |
UseStringFormat | 6.44x | 3.54x | 6.38x | 6.41x | 5.27x |
UseStringBuilder | 1.50x | 2.12x | 3.54x | 5.32x | 1.07x |
UseStringBuilder1024 | 3.73x | 9.11x | 3.53x | 3.97x | 1.88x |
数据跑了多次,可能受到机器本身的影响,数据都不是特别的一致,但基本规律还是可以看到的。
结论
- string.UseConcat 方法最快
- string.Formatt 方法最慢
- 10个左右的时候运算符直接处理也不会慢到哪里去
- 将StringBuilder的初始容器放大(测试用例是1k),貌似对小数据量的拼接起不到多大的作用。