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:\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<string>  保存,可以有较大的性能提升。当然也可以大约估计最终字符串长度,然后初始化StringBuilder 时候使用较大的容量,以空间来换取速度

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

 

参考:

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

转载于:https://www.cnblogs.com/gsjlovenet/p/7263178.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据

MySQL8.0 初级学习笔记(六)查询数据MySQL8.0 初级学习笔记(六)查询数据查询有多种方法&#xff1a;单表查询&#xff0c;使用集合函数查询&#xff0c;连接查询&#xff0c;子查询&#xff0c;合并查询结果&#xff0c;为表和字段取别名&#xff0c;使用正则表达式查询一、单表…

特斯拉Autopilot事故频发,真正意义上自动驾驶还要多久问世?

这并不是特斯拉 Autopilot 首次发生事故致死案例。来源&#xff1a;未来汽车科技的新能源汽车更替传统汽车是时代趋势&#xff0c;作为业内先驱&#xff0c;身处聚光灯下的特斯拉不可避免会受到大众关注&#xff0c;例如涉及它的每一次交通安全事件从不会在媒体报道中缺席。据外…

BDD 与DSL 入门

正文&#xff1a; Behavior Driven Development&#xff0c;行为驱动开发是一种敏捷软件开发的技术&#xff0c;它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。在了解Behavior Driven Development之前&#xff0c;先介绍Test-Driven Development(TDD)即测试…

CICC科普栏目|颠覆认知!看完这些图,你的世界观还好吗?

本文系网易新闻网易号“各有态度”特色内容部分资料来源于网络转自&#xff1a;超级数学建模接下来&#xff0c;仔细看下面的图与文字你会非常震撼……每天&#xff0c;地球上都有这么多的人在飞来飞去&#xff0c;就像下图中一样。▼图中圈圈里头的人口&#xff0c;比其他地区…

python indices_python numpy triu_indices函数

numpy.triu_indices返回函数的上三角矩阵numpy.triu_indices(n,k0,mNone)[source]Return the indices for the upper-triangle of an (n, m) array.Parameters: n : intThe size of the arrays for which the returned indices will be valid.k : int, optionalDiagonal offse…

django-xadmin使用之更改菜单url

环境&#xff1a;xadmin-for-python3 python3.5.2 django1.9.12 1. 在模块的adminx.py文件中增加以下代码&#xff1a; class AdminSettings(object):site_title XXX Data Centersite_footer XXX Inc.# menu_style accordion# 菜单设置def get_site_menu(self):return ({tit…

RISC-V会彻底改变计算吗?

来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;编译自「ACM」&#xff0c;谢谢。微处理器的开放指令集有望重塑计算&#xff0c;并引入新的、更强大的功能。现代计算机依靠许多元件来提供高速和高性能&#xff0c;但是很少有比一台精简的指…

如何将随机数存入数组java_JAVA怎么把随机数赋给数组

JAVA怎么把随机数赋给数组来源:互联网 宽屏版 评论2012-05-29 12:50:14分类: 电脑/网络 >> 程序设计 >> 其他编程语言问题描述:double aMath.random();可以产生个随机数&#xff0c;怎么产生100个这样的随机数然后赋值给数组并输出呢&#xff1f;参考答案:public…

java keystore ca_PKCS12 Java Keystore from CA and User certificate in java

问题Ive recently been put in charge of mocking up an Apple product (iPhone Configuration Utility) in Java. One of the sections Ive been a bit stuck on is a part about Exchange ActiveSync. In there, it allows you to select a certificate from your Keychain t…

干货|六维力和力矩传感器的技术与应用

来源&#xff1a;机器人大讲堂六维力和力矩传感器是一种提供三轴力和三轴力矩反馈的设备&#xff0c;并广泛应用在机器人控制、力学实验和科研等不同的场景中。不同于其他常见的测力仪器&#xff0c;六维力和力矩传感器可以测量完整的六自由度环境力数据&#xff0c;从而使其适…

Spark笔记——技术点汇总

Spark笔记——技术点汇总 目录 概况 手工搭建集群 引言 安装Scala 配置文件 启动与测试 应用部署 部署架构 应用程序部署 核心原理 RDD概念 RDD核心组成 RDD依赖关系 DAG图 RDD故障恢复机制 Standalone模式的Spark架构 YARN模式的Spark架构 应用程序资源构建…

人工智能正在推动芯片的复兴

来源丨Forbes作者丨Rob Toews编译丨科技行者半导体是数字时代的一项基础技术。美国硅谷的名字正是源自于此。过去半个世纪以来&#xff0c;计算技术的革命改变着社会的方方面面&#xff0c;而半导体技术正是这场革命的核心。自英特尔1971年推出全球第一个微处理器以来&#xff…

java integer 包_java之学习基本类型包装类的概述及Integer类的概述和构造方法

基本类型包装类的概述A:为什么会有基本类型包装类* 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。* B:常用操作* 常用的操作之一&#xff1a;用于基本数据类型与字符串之间的转换。* C:基本类型和包装类的对应byte Byteshort …

UVA3942 Remember the Word

题意&#xff1a;输入一个字符串(l<300000)&#xff0c;一个n(n<4000)&#xff0c;接下来n个字符串(l<100)&#xff0c;问能分解成几种字符串 题解&#xff1a;直接计算复杂度高&#xff0c;考虑DP&#xff0c;dp[i]代表以第i个字符开头的字符串分解的方案数&#xff…

MEMS为何独领风骚?看完这篇秒懂!

显微镜下的MEMS结构&#xff08;注意图片上的刻度&#xff0c;是微米哦&#xff09;文章来源&#xff1a;硬件十万个为什么卡西欧早年就以电机马达、继电器等机电产品闻名。如今的卡西欧本身就是MEMS的制造商之一&#xff0c;用MEMS的思路解决传统机械手表遇到的问题是卡西欧的…

如何把我的Java程序变成exe文件?

JAVA是一种“跨平台”的语言&#xff0c;拥有“一次编写&#xff0c;处处运行”的特点&#xff0c;让它成为当今IT行业&#xff0c;必不可少的一门编程语言。每一个软件开发完成之后&#xff0c;应该大家都需要打包程序并发送给客户&#xff0c;常见的方式&#xff1a;java程序…

福布斯:混合现实未来的八大应用场景

来源&#xff1a;AR工业应用近日&#xff0c;福布斯发布了一篇关于混合现实未来的八个值得关注的领域和应用场景。文中提到&#xff1a;随着时间的推移&#xff0c;技术永远在不断进展&#xff0c;而未来技术中很可能是AR和VR的结合形式。有报告显示&#xff1a;2024年&#xf…

php怎么实现简单的mvc框架,php实现简单的MVC框架实例

这篇文章主要介绍了php实现简单的MVC框架,较为详细的分析了php实现MVC框架的相关实现技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下本文实例讲述了php实现简单的MVC框架。分享给大家供大家参考。具体如下&#xff1a;在开始之前需要知道的知识1.php基础知识2.单一…

演化树,靠不住?挑战物种出现与灭绝速率的估算方法

来源&#xff1a;Nature自然科研原文作者&#xff1a;Mark Pagel以演化树形式绘制的图表能够显示物种之间的系统发育关系&#xff0c;这类图表被广泛用于估算新物种出现以及现存物种灭绝的速率&#xff0c;但一项新的研究对这种方法提出了质疑。科学家经常试图对生物的过去是什…

Windows中使用wget整站下载

weget wget安装 Windows下载 点击下载 https://eternallybored.org/misc/wget/会跳转到wget的下载页&#xff0c;根据自己电脑选择下载的文件&#xff0c;我下载的版本为wget-1.19.1-win64.zip下载完成后解压文件,并且双击exe使用wget wget使用 在需要下载到网站的位置新建文…