StringBuilder String string.Concat 字符串拼接速度再议
首先看测试代码:
public class StringSpeedTest
{
private readonly static string _testStr = ""; public string StringAdd(int count)
{
string str = string.Empty;
for (int i = ; i < count; i++)
{
str += _testStr;
}
return str;
} public string UseStringBuilder(int count)
{
StringBuilder sb = new StringBuilder(); for (int i = ; i < count; i++)
{
sb.Append(_testStr);
} return sb.ToString();
}
public string UseStringBuilderWithCapacity(int count)
{
StringBuilder sb = new StringBuilder(count * _testStr.Length); for (int i = ; i < count; i++)
{
sb.Append(_testStr);
} return sb.ToString();
}
public string UseStringConcat(int count)
{
string[] list = new string[count];
for (int i = ; i < count; i++)
{
list[i] = _testStr;
}
return string.Concat(list);
}
public string UseStringConcatWithList(int count)
{
List<string> list = new List<string>(count);
for (int i = ; i < count; i++)
{
list.Add(_testStr);
}
return string.Concat(list);
}
public string UseStringConcatWithListToArray(int count)
{
List<string> list = new List<string>(count);
for (int i = ; i < count; i++)
{
list.Add(_testStr);
}
return string.Concat(list.ToArray());
}
}
Stopwatch watch = new Stopwatch();
StringSpeedTest strSpeedTest = new StringSpeedTest(); int count = ;
TimeSpan time = new TimeSpan(, , );
watch.Start();
for (int i = ; i < ; i++)
{
Console.WriteLine("-------------------------------------------------------------------");
strSpeedTest.StringAdd(count); Console.WriteLine($"StringAdd:\t\t\t{watch.Elapsed - time}");
time = watch.Elapsed; strSpeedTest.UseStringBuilder(count);
Console.WriteLine($"UseStringBuilder:\t\t{watch.Elapsed - time}");
time = watch.Elapsed; strSpeedTest.UseStringBuilderWithCapacity(count);
Console.WriteLine($"UseStringBuilderWithCapacity:\t{watch.Elapsed - time}");
time = watch.Elapsed; strSpeedTest.UseStringConcatWithList(count);
Console.WriteLine($"UseStringConcatWithList:\t{watch.Elapsed - time}");
time = watch.Elapsed; strSpeedTest.UseStringConcatWithListToArray(count);
Console.WriteLine($"UseStringConcatWithListToArray:\t{watch.Elapsed - time}");
time = watch.Elapsed; strSpeedTest.UseStringConcat(count);
Console.WriteLine($"UseStringConcat:\t\t{watch.Elapsed - time}"); Console.WriteLine("*******************************************************************");
} watch.Stop();
测试结果:
-------------------------------------------------------------------
StringAdd: ::00.2908582
UseStringBuilder: ::00.0008419
UseStringBuilderWithCapacity: ::00.0008429
UseStringConcatWithList: ::00.0101701
UseStringConcatWithListToArray: ::00.0032169
UseStringConcat: ::00.0005971
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1373059
UseStringBuilder: ::00.0003654
UseStringBuilderWithCapacity: ::00.0003533
UseStringConcatWithList: ::00.0006684
UseStringConcatWithListToArray: ::00.0003922
UseStringConcat: ::00.0003371
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1313924
UseStringBuilder: ::00.0003778
UseStringBuilderWithCapacity: ::00.0010882
UseStringConcatWithList: ::00.0010397
UseStringConcatWithListToArray: ::00.0007571
UseStringConcat: ::00.0004528
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1282163
UseStringBuilder: ::00.0003770
UseStringBuilderWithCapacity: ::00.0003452
UseStringConcatWithList: ::00.0006388
UseStringConcatWithListToArray: ::00.0003873
UseStringConcat: ::00.0004068
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1349978
UseStringBuilder: ::00.0004084
UseStringBuilderWithCapacity: ::00.0003698
UseStringConcatWithList: ::00.0006802
UseStringConcatWithListToArray: ::00.0004059
UseStringConcat: ::00.0003503
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1290642
UseStringBuilder: ::00.0003813
UseStringBuilderWithCapacity: ::00.0003674
UseStringConcatWithList: ::00.0006886
UseStringConcatWithListToArray: ::00.0004115
UseStringConcat: ::00.0003509
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1363654
UseStringBuilder: ::00.0003885
UseStringBuilderWithCapacity: ::00.0004270
UseStringConcatWithList: ::00.0007209
UseStringConcatWithListToArray: ::00.0004618
UseStringConcat: ::00.0003863
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1326732
UseStringBuilder: ::00.0003978
UseStringBuilderWithCapacity: ::00.0003965
UseStringConcatWithList: ::00.0006867
UseStringConcatWithListToArray: ::00.0004012
UseStringConcat: ::00.0003480
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1275684
UseStringBuilder: ::00.0003673
UseStringBuilderWithCapacity: ::00.0004190
UseStringConcatWithList: ::00.0007201
UseStringConcatWithListToArray: ::00.0004572
UseStringConcat: ::00.0003848
*******************************************************************
-------------------------------------------------------------------
StringAdd: ::00.1606576
UseStringBuilder: ::00.0004435
UseStringBuilderWithCapacity: ::00.0005415
UseStringConcatWithList: ::00.0007263
UseStringConcatWithListToArray: ::00.0004205
UseStringConcat: ::00.0003707
*******************************************************************
从结果中可以看到,StringBuilder 速度不是永远最快的。当把cout调整为100000时 结果如下,由于string直接+速度太慢直接去除比较梯队。
-------------------------------------------------------------------
UseStringBuilder: ::00.1400624
UseStringBuilderWithCapacity: ::00.0057860
UseStringConcatWithList: ::00.0186478
UseStringConcatWithListToArray: ::00.0074943
UseStringConcat: ::00.0054871
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0115386
UseStringBuilderWithCapacity: ::00.0057336
UseStringConcatWithList: ::00.0080408
UseStringConcatWithListToArray: ::00.0052401
UseStringConcat: ::00.0037864
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0085633
UseStringBuilderWithCapacity: ::00.0049141
UseStringConcatWithList: ::00.0179742
UseStringConcatWithListToArray: ::00.0045335
UseStringConcat: ::00.0042053
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0085083
UseStringBuilderWithCapacity: ::00.0041245
UseStringConcatWithList: ::00.0080081
UseStringConcatWithListToArray: ::00.0043282
UseStringConcat: ::00.0037264
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0087733
UseStringBuilderWithCapacity: ::00.0086311
UseStringConcatWithList: ::00.0080520
UseStringConcatWithListToArray: ::00.0056323
UseStringConcat: ::00.0038094
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0086884
UseStringBuilderWithCapacity: ::00.0063233
UseStringConcatWithList: ::00.0081824
UseStringConcatWithListToArray: ::00.0055393
UseStringConcat: ::00.0040967
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0108527
UseStringBuilderWithCapacity: ::00.0048482
UseStringConcatWithList: ::00.0079176
UseStringConcatWithListToArray: ::00.0043536
UseStringConcat: ::00.0042921
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0119569
UseStringBuilderWithCapacity: ::00.0043067
UseStringConcatWithList: ::00.0091552
UseStringConcatWithListToArray: ::00.0045956
UseStringConcat: ::00.0041058
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0096342
UseStringBuilderWithCapacity: ::00.0055840
UseStringConcatWithList: ::00.0073000
UseStringConcatWithListToArray: ::00.0056438
UseStringConcat: ::00.0038800
*******************************************************************
-------------------------------------------------------------------
UseStringBuilder: ::00.0090576
UseStringBuilderWithCapacity: ::00.0047266
UseStringConcatWithList: ::00.0076383
UseStringConcatWithListToArray: ::00.0048706
UseStringConcat: ::00.0048964
*******************************************************************
从结果中可以看到再没有使用初始化StringBuilder 容器容量的时候,性能与使用string.Concat相差已经很大。在使用初始化容量之后 性能有较大的提升。
总结如下:
1、在只知道字符串最终长度的时候,可以使用 StringBuilder 并初始化容量,可以有较大的提升;
2、在不知道最终字符串长度时候,但是知道拼接字符串次数的时候,可以将每次字符串保存在一个字符串数组中,可以有较大的性能提升;
3、在不知道字符串长度以及拼接的次数的时候,可以使用LIst<string> 保存,可以有较大的性能提升。当然也可以大约估计最终字符串长度,然后初始化StringBuilder 时候使用较大的容量,以空间来换取速度
当然这些都是在拼接字符串的次数很大的情况下,会有较大的性能提升。
参考:
http://blog.zhaojie.me/2009/11/string-concat-perf-1-benchmark.html
StringBuilder String string.Concat 字符串拼接速度再议的更多相关文章
- StringBuilder String string.Concat 字符串拼接速度
首先看测试代码: public class StringSpeedTest { "; public string StringAdd(int count) { string str = st ...
- js扩展String.prototype.format字符串拼接的功能
1.题外话,有关概念理解:String.prototype 属性表示 String原型对象.所有 String 的实例都继承自 String.prototype. 任何String.prototype ...
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...
- 将String类型的字符串拼接成以逗号分隔的字符输出
package test; import java.util.ArrayList; import java.util.List; public class Tesdssss { private sta ...
- mysql 存储过程 CONCAT 字符串拼接
mysql 存储过程 CREATE PROCEDURE pro_province_report (IN startDate VARCHAR(),IN endDate VARCHAR(),IN Sour ...
- Java中测试StringBuilder、StringBuffer、String在字符串拼接上的性能
应一个大量字符串拼接的任务 测试一下StringBuilder.StringBuffer.String在操作字符串拼接时候的性能 性能上理论是StringBuilder > StringBu ...
- 从为什么String=String谈到StringBuilder和StringBuffer
前言 有这么一段代码: public class TestMain { public static void main(String[] args) { String str0 = "123 ...
- StringBuilder与String互转
StringBuilder类是一个可变的字符序列. StringBuilder() 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符.StringBuilder(Ch ...
- 字符串拼接原理 javac 和 javap
一.新建一个 Test1 类 public class Test1 { public static void main(String[] args) { String a = "a" ...
随机推荐
- WebSocket原理与实践(一)---基本原理
WebSocket原理与实践(一)---基本原理 一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般 ...
- CVE-2016-7912 分析报告
CVE-2016-7912 背景介绍 在内核USB驱动中,进行异步读取或写入时,调用ki_complete(),会提前释放kiocb结构体,从而造成UAF漏洞,但经过分析,发现无法利用此漏洞进行攻击. ...
- C++ 文件和流
到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流. 本教程介绍如何从文件读取流和向文件写入流.这就需要用到 C++ ...
- jquery $.each()遍历json数组
使用jQuery的$.each()方法来遍历一个数组对象 var json=[ {"id":"1","tagName":"appl ...
- 并行编程(Parallel Framework)
前言 并行编程:通过编码方式利用多核或多处理器称为并行编程,多线程概念的一个子集. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.多线程的一种. 并行编程分为如下几个结构: 1 ...
- 先埋锅-CF-Valid BFS?-差一点没交上
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- VC++6.0的使用感想
VC++6.0是我接触的第一款编程软件,一直以来都是使用这款软件来完成程序的编写,调试,运行.一直以来都是用C语言编写代码.而VC++6.0窗口简洁明了,占用资源少,上手容易,个人表示很喜欢. VC+ ...
- 如何启动Intel VT-X及合理利用搜索
昨天安装Vmware的时候不幸遇到了Vt-X被禁用的麻烦,上网百度了一下才知道要进入Bois进行设置.说起百度就不得不提到模糊搜索这个概念.这个特性的优点和缺点可谓同等突出,有了模糊搜索大家可以在信息 ...
- 个人作业Week1
一.<构建之法>提问 1.需求是什么?需求的规范需要明确吗? 2.一个人开发效率非常高,多人开发,个人效率随团队人数上升而直线下降,我们一般需要将大项目拆为小项目,使协作耦合产生的效率负影 ...
- Apollo的Oracle适配
Apollo的Oracle适配改动 这几天工作需要使用Apollo配置中心.Apollo唯一的依赖是MySQL数据库,然而公司只有Oracle数据库资源.这里有一个Oracle适配改动的分支,但是 ...