热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

StringBuilderStringstring.Concat字符串拼接速度再议

首先看测试代码:1publicclassStringSpeedTest2{3privatereadonlystaticstring_testStr

首先看测试代码:

 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 )
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 )
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 )
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 )
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 )
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 )
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:\t\t\t{watch.Elapsed - time}");
13 time = watch.Elapsed;
14
15 strSpeedTest.UseStringBuilder(count);
16 Console.WriteLine($"UseStringBuilder:\t\t{watch.Elapsed - time}");
17 time = watch.Elapsed;
18
19 strSpeedTest.UseStringBuilderWithCapacity(count);
20 Console.WriteLine($"UseStringBuilderWithCapacity:\t{watch.Elapsed - time}");
21 time = watch.Elapsed;
22
23 strSpeedTest.UseStringConcatWithList(count);
24 Console.WriteLine($"UseStringConcatWithList:\t{watch.Elapsed - time}");
25 time = watch.Elapsed;
26
27 strSpeedTest.UseStringConcatWithListToArray(count);
28 Console.WriteLine($"UseStringConcatWithListToArray:\t{watch.Elapsed - time}");
29 time = watch.Elapsed;
30
31 strSpeedTest.UseStringConcat(count);
32 Console.WriteLine($"UseStringConcat:\t\t{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  保存,可以有较大的性能提升。当然也可以大约估计最终字符串长度,然后初始化StringBuilder 时候使用较大的容量,以空间来换取速度

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

 

参考:

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


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
author-avatar
罢脑货_246
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有