zoukankan      html  css  js  c++  java
  • StringBuilder String string.Concat 字符串拼接速度再议

    首先看测试代码:

     1   public class StringSpeedTest
     2     {
     3         private readonly static string _testStr = "0123456789";
     4 
     5         public string StringAdd(int count)
     6         {
     7             string str = string.Empty;
     8             for (int i = 0; i < count; i++)
     9             {
    10                 str += _testStr;
    11             }
    12             return str;
    13         }
    14 
    15         public string UseStringBuilder(int count)
    16         {
    17             StringBuilder sb = new StringBuilder();
    18 
    19             for (int i = 0; i < count; i++)
    20             {
    21                 sb.Append(_testStr);
    22             }
    23 
    24             return sb.ToString();
    25         }
    26         public string UseStringBuilderWithCapacity(int count)
    27         {
    28             StringBuilder sb = new StringBuilder(count * _testStr.Length);
    29 
    30             for (int i = 0; i < count; i++)
    31             {
    32                 sb.Append(_testStr);
    33             }
    34 
    35             return sb.ToString();
    36         }
    37         public string UseStringConcat(int count)
    38         {
    39             string[] list = new string[count];
    40             for (int i = 0; i < count; i++)
    41             {
    42                 list[i] = _testStr;
    43             }
    44             return string.Concat(list);
    45         }
    46         public string UseStringConcatWithList(int count)
    47         {
    48             List<string> list = new List<string>(count);
    49             for (int i = 0; i < count; i++)
    50             {
    51                 list.Add(_testStr);
    52             }
    53             return string.Concat(list);
    54         }
    55         public string UseStringConcatWithListToArray(int count)
    56         {
    57             List<string> list = new List<string>(count);
    58             for (int i = 0; i < count; i++)
    59             {
    60                 list.Add(_testStr);
    61             }
    62             return string.Concat(list.ToArray());
    63         }
    64     }
    View Code
     1 Stopwatch watch = new Stopwatch();
     2             StringSpeedTest strSpeedTest = new StringSpeedTest();
     3 
     4             int count = 10000;
     5             TimeSpan time = new TimeSpan(0, 0, 0);
     6             watch.Start();
     7             for (int i = 0; i < 10; i++)
     8             {
     9                 Console.WriteLine("-------------------------------------------------------------------");
    10                 strSpeedTest.StringAdd(count);
    11 
    12                 Console.WriteLine($"StringAdd:			{watch.Elapsed - time}");
    13                 time = watch.Elapsed;
    14 
    15                 strSpeedTest.UseStringBuilder(count);
    16                 Console.WriteLine($"UseStringBuilder:		{watch.Elapsed - time}");
    17                 time = watch.Elapsed;
    18 
    19                 strSpeedTest.UseStringBuilderWithCapacity(count);
    20                 Console.WriteLine($"UseStringBuilderWithCapacity:	{watch.Elapsed - time}");
    21                 time = watch.Elapsed;
    22 
    23                 strSpeedTest.UseStringConcatWithList(count);
    24                 Console.WriteLine($"UseStringConcatWithList:	{watch.Elapsed - time}");
    25                 time = watch.Elapsed;
    26 
    27                 strSpeedTest.UseStringConcatWithListToArray(count);
    28                 Console.WriteLine($"UseStringConcatWithListToArray:	{watch.Elapsed - time}");
    29                 time = watch.Elapsed;
    30 
    31                 strSpeedTest.UseStringConcat(count);
    32                 Console.WriteLine($"UseStringConcat:		{watch.Elapsed - time}");
    33 
    34 
    35                 Console.WriteLine("*******************************************************************");
    36             }
    37 
    38             watch.Stop();
    View Code

    测试结果:

     1 -------------------------------------------------------------------
     2 StringAdd:                      00:00:00.2908582
     3 UseStringBuilder:               00:00:00.0008419
     4 UseStringBuilderWithCapacity:   00:00:00.0008429
     5 UseStringConcatWithList:        00:00:00.0101701
     6 UseStringConcatWithListToArray: 00:00:00.0032169
     7 UseStringConcat:                00:00:00.0005971
     8 *******************************************************************
     9 -------------------------------------------------------------------
    10 StringAdd:                      00:00:00.1373059
    11 UseStringBuilder:               00:00:00.0003654
    12 UseStringBuilderWithCapacity:   00:00:00.0003533
    13 UseStringConcatWithList:        00:00:00.0006684
    14 UseStringConcatWithListToArray: 00:00:00.0003922
    15 UseStringConcat:                00:00:00.0003371
    16 *******************************************************************
    17 -------------------------------------------------------------------
    18 StringAdd:                      00:00:00.1313924
    19 UseStringBuilder:               00:00:00.0003778
    20 UseStringBuilderWithCapacity:   00:00:00.0010882
    21 UseStringConcatWithList:        00:00:00.0010397
    22 UseStringConcatWithListToArray: 00:00:00.0007571
    23 UseStringConcat:                00:00:00.0004528
    24 *******************************************************************
    25 -------------------------------------------------------------------
    26 StringAdd:                      00:00:00.1282163
    27 UseStringBuilder:               00:00:00.0003770
    28 UseStringBuilderWithCapacity:   00:00:00.0003452
    29 UseStringConcatWithList:        00:00:00.0006388
    30 UseStringConcatWithListToArray: 00:00:00.0003873
    31 UseStringConcat:                00:00:00.0004068
    32 *******************************************************************
    33 -------------------------------------------------------------------
    34 StringAdd:                      00:00:00.1349978
    35 UseStringBuilder:               00:00:00.0004084
    36 UseStringBuilderWithCapacity:   00:00:00.0003698
    37 UseStringConcatWithList:        00:00:00.0006802
    38 UseStringConcatWithListToArray: 00:00:00.0004059
    39 UseStringConcat:                00:00:00.0003503
    40 *******************************************************************
    41 -------------------------------------------------------------------
    42 StringAdd:                      00:00:00.1290642
    43 UseStringBuilder:               00:00:00.0003813
    44 UseStringBuilderWithCapacity:   00:00:00.0003674
    45 UseStringConcatWithList:        00:00:00.0006886
    46 UseStringConcatWithListToArray: 00:00:00.0004115
    47 UseStringConcat:                00:00:00.0003509
    48 *******************************************************************
    49 -------------------------------------------------------------------
    50 StringAdd:                      00:00:00.1363654
    51 UseStringBuilder:               00:00:00.0003885
    52 UseStringBuilderWithCapacity:   00:00:00.0004270
    53 UseStringConcatWithList:        00:00:00.0007209
    54 UseStringConcatWithListToArray: 00:00:00.0004618
    55 UseStringConcat:                00:00:00.0003863
    56 *******************************************************************
    57 -------------------------------------------------------------------
    58 StringAdd:                      00:00:00.1326732
    59 UseStringBuilder:               00:00:00.0003978
    60 UseStringBuilderWithCapacity:   00:00:00.0003965
    61 UseStringConcatWithList:        00:00:00.0006867
    62 UseStringConcatWithListToArray: 00:00:00.0004012
    63 UseStringConcat:                00:00:00.0003480
    64 *******************************************************************
    65 -------------------------------------------------------------------
    66 StringAdd:                      00:00:00.1275684
    67 UseStringBuilder:               00:00:00.0003673
    68 UseStringBuilderWithCapacity:   00:00:00.0004190
    69 UseStringConcatWithList:        00:00:00.0007201
    70 UseStringConcatWithListToArray: 00:00:00.0004572
    71 UseStringConcat:                00:00:00.0003848
    72 *******************************************************************
    73 -------------------------------------------------------------------
    74 StringAdd:                      00:00:00.1606576
    75 UseStringBuilder:               00:00:00.0004435
    76 UseStringBuilderWithCapacity:   00:00:00.0005415
    77 UseStringConcatWithList:        00:00:00.0007263
    78 UseStringConcatWithListToArray: 00:00:00.0004205
    79 UseStringConcat:                00:00:00.0003707
    80 *******************************************************************
    View Code

     从结果中可以看到,StringBuilder 速度不是永远最快的。当把cout调整为100000时 结果如下,由于string直接+速度太慢直接去除比较梯队。

     1 -------------------------------------------------------------------
     2 UseStringBuilder:               00:00:00.1400624
     3 UseStringBuilderWithCapacity:   00:00:00.0057860
     4 UseStringConcatWithList:        00:00:00.0186478
     5 UseStringConcatWithListToArray: 00:00:00.0074943
     6 UseStringConcat:                00:00:00.0054871
     7 *******************************************************************
     8 -------------------------------------------------------------------
     9 UseStringBuilder:               00:00:00.0115386
    10 UseStringBuilderWithCapacity:   00:00:00.0057336
    11 UseStringConcatWithList:        00:00:00.0080408
    12 UseStringConcatWithListToArray: 00:00:00.0052401
    13 UseStringConcat:                00:00:00.0037864
    14 *******************************************************************
    15 -------------------------------------------------------------------
    16 UseStringBuilder:               00:00:00.0085633
    17 UseStringBuilderWithCapacity:   00:00:00.0049141
    18 UseStringConcatWithList:        00:00:00.0179742
    19 UseStringConcatWithListToArray: 00:00:00.0045335
    20 UseStringConcat:                00:00:00.0042053
    21 *******************************************************************
    22 -------------------------------------------------------------------
    23 UseStringBuilder:               00:00:00.0085083
    24 UseStringBuilderWithCapacity:   00:00:00.0041245
    25 UseStringConcatWithList:        00:00:00.0080081
    26 UseStringConcatWithListToArray: 00:00:00.0043282
    27 UseStringConcat:                00:00:00.0037264
    28 *******************************************************************
    29 -------------------------------------------------------------------
    30 UseStringBuilder:               00:00:00.0087733
    31 UseStringBuilderWithCapacity:   00:00:00.0086311
    32 UseStringConcatWithList:        00:00:00.0080520
    33 UseStringConcatWithListToArray: 00:00:00.0056323
    34 UseStringConcat:                00:00:00.0038094
    35 *******************************************************************
    36 -------------------------------------------------------------------
    37 UseStringBuilder:               00:00:00.0086884
    38 UseStringBuilderWithCapacity:   00:00:00.0063233
    39 UseStringConcatWithList:        00:00:00.0081824
    40 UseStringConcatWithListToArray: 00:00:00.0055393
    41 UseStringConcat:                00:00:00.0040967
    42 *******************************************************************
    43 -------------------------------------------------------------------
    44 UseStringBuilder:               00:00:00.0108527
    45 UseStringBuilderWithCapacity:   00:00:00.0048482
    46 UseStringConcatWithList:        00:00:00.0079176
    47 UseStringConcatWithListToArray: 00:00:00.0043536
    48 UseStringConcat:                00:00:00.0042921
    49 *******************************************************************
    50 -------------------------------------------------------------------
    51 UseStringBuilder:               00:00:00.0119569
    52 UseStringBuilderWithCapacity:   00:00:00.0043067
    53 UseStringConcatWithList:        00:00:00.0091552
    54 UseStringConcatWithListToArray: 00:00:00.0045956
    55 UseStringConcat:                00:00:00.0041058
    56 *******************************************************************
    57 -------------------------------------------------------------------
    58 UseStringBuilder:               00:00:00.0096342
    59 UseStringBuilderWithCapacity:   00:00:00.0055840
    60 UseStringConcatWithList:        00:00:00.0073000
    61 UseStringConcatWithListToArray: 00:00:00.0056438
    62 UseStringConcat:                00:00:00.0038800
    63 *******************************************************************
    64 -------------------------------------------------------------------
    65 UseStringBuilder:               00:00:00.0090576
    66 UseStringBuilderWithCapacity:   00:00:00.0047266
    67 UseStringConcatWithList:        00:00:00.0076383
    68 UseStringConcatWithListToArray: 00:00:00.0048706
    69 UseStringConcat:                00:00:00.0048964
    70 *******************************************************************
    View Code

     从结果中可以看到再没有使用初始化StringBuilder 容器容量的时候,性能与使用string.Concat相差已经很大。在使用初始化容量之后 性能有较大的提升。

    总结如下:

    1、在只知道字符串最终长度的时候,可以使用 StringBuilder 并初始化容量,可以有较大的提升;

    2、在不知道最终字符串长度时候,但是知道拼接字符串次数的时候,可以将每次字符串保存在一个字符串数组中,可以有较大的性能提升;

    3、在不知道字符串长度以及拼接的次数的时候,可以使用LIst<string>  保存,可以有较大的性能提升。当然也可以大约估计最终字符串长度,然后初始化StringBuilder 时候使用较大的容量,以空间来换取速度

    当然这些都是在拼接字符串的次数很大的情况下,会有较大的性能提升。

    参考:

    http://blog.zhaojie.me/2009/11/string-concat-perf-1-benchmark.html

  • 相关阅读:
    在做5道习题,个别习题有难度,需要很多天,加油把自己,有看到这个随笔的小伙伴评论可以留言讨论或发出你的答案~
    python中的open、close、read、write、len、exists
    python中的type
    python中strip、startswith、endswith
    python3_learn 实现文件夹内批量对图片重命名
    [转载]利用分块传输绕过WAF进行SQL注入
    bypass安全狗测试学习
    [转+自]SSH工作原理
    NCTF2019 小部分题解
    XML外部实体注入[转载]
  • 原文地址:https://www.cnblogs.com/gsjlovenet/p/7263178.html
Copyright © 2011-2022 走看看