首先看测试代码:

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 时候使用较大的容量,以空间来换取速度

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

StringBuilder String string.Concat 字符串拼接速度的更多相关文章

  1. StringBuilder String string.Concat 字符串拼接速度再议

    首先看测试代码: public class StringSpeedTest { "; public string StringAdd(int count) { string str = st ...

  2. js扩展String.prototype.format字符串拼接的功能

    1.题外话,有关概念理解:String.prototype 属性表示 String原型对象.所有 String 的实例都继承自 String.prototype. 任何String.prototype ...

  3. 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

    长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...

  4. 将String类型的字符串拼接成以逗号分隔的字符输出

    package test; import java.util.ArrayList; import java.util.List; public class Tesdssss { private sta ...

  5. mysql 存储过程 CONCAT 字符串拼接

    mysql 存储过程 CREATE PROCEDURE pro_province_report (IN startDate VARCHAR(),IN endDate VARCHAR(),IN Sour ...

  6. Java中测试StringBuilder、StringBuffer、String在字符串拼接上的性能

    应一个大量字符串拼接的任务 测试一下StringBuilder.StringBuffer.String在操作字符串拼接时候的性能 性能上理论是StringBuilder  >  StringBu ...

  7. 从为什么String=String谈到StringBuilder和StringBuffer

    前言 有这么一段代码: public class TestMain { public static void main(String[] args) { String str0 = "123 ...

  8. StringBuilder与String互转

    StringBuilder类是一个可变的字符序列. StringBuilder()           构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符.StringBuilder(Ch ...

  9. 字符串拼接原理 javac 和 javap

    一.新建一个 Test1 类 public class Test1 { public static void main(String[] args) { String a = "a" ...

随机推荐

  1. 3G模块(U6300)linux下拨号上网

    U6300支持linux.Android系列嵌入式系统.作为linux内核系统,系统均会自带驱动usbserial,就没有提供专门的U6300V的USB驱动,都是加载系统的usbserial以实现对U ...

  2. 02 SQL 执行

    sql 被保存在 share pool 后, 开始解析, 解析包括语句的语法, 检验及对象, 以确认该用于是否有该对象的权限, 如果这些都通过了, 接下来就要看这个语句之前是否被执行过, 如果是, o ...

  3. Windows下 Zmq v4.0.4的使用 (C++)

    最近在研究Zero的使用. 我在网上找了一下,发觉大部分博客都写得乱七八糟,又不写明什么版本,什么系统下的,我都不知道怎么样才能弄出个编译过的程序来,只好自己摸索了. 我是windows下 使用vs2 ...

  4. 图片触及翻转效果 css3

    实现图片由左向右飞入回到最初设定位置 ,鼠标浮上去旋转显示另一张图片效果: html: <!DOCTYPE HTML> <html> <head> <meta ...

  5. PHP输出javascript,alert中文乱码解决办法

    echo '<html><head><meta http-equiv="Content-Type" content="text/html; ...

  6. Python之Seaborn

    install: pip install seaborn official examples: https://seaborn.pydata.org/examples/index.html 在mac上 ...

  7. 网页端的utf8和gb2312 之间关于osd 传参数的乱码问题

    (0)HZK16 点阵字库原理及实现 (1)utf8 和 unicode gb2312之间的转换 (2)gb2312 的拓展 gbk 实现了更多的文字编码 像“瞭望塔”的瞭子在gb2312中是没有的 ...

  8. 【BZOJ】3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3404 写挫好几次.... 裸的博弈论即可.. #include <cstdio> #in ...

  9. 一起学android之设置ListView数据显示的动画效果(24)

    效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFpX3FpbmdfeHVfa29uZw==/font/5a6L5L2T/fontsize/40 ...

  10. 再谈iOS 7的手势滑动返回功能

    本文转载至 http://blog.csdn.net/jasonblog/article/details/28282147  之前随手写过一篇<使用UIScreenEdgePanGestureR ...