.net开发者的Blog

专注于 .net / .net core 的开发,与金融(期货)的实践

字符串拼接的性能测试

字符串拼接的性能测试

字符串的拼接是各种性能文章里最常说的优化内容。大体上是如果拼接的字符串比较多的时候,需要用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

数据跑了多次,可能受到机器本身的影响,数据都不是特别的一致,但基本规律还是可以看到的。

结论

  1. string.UseConcat 方法最快
  2. string.Formatt 方法最慢
  3. 10个左右的时候运算符直接处理也不会慢到哪里去
  4. 将StringBuilder的初始容器放大(测试用例是1k),貌似对小数据量的拼接起不到多大的作用。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«   2019年6月   »
12
3456789
10111213141516
17181920212223
24252627282930
网站分类
文章归档

Powered By Z-BlogPHP 1.5.2 Zero

Copyright csharptools.cn Rights Reserved. 桂ICP备17007292号