C#基础——String和StringBuilder效率测试
2014-07-30 17:11
423 查看
引言
在写C#程序的时候,我们经常会用到字符串类String和StringBuilder类。很多人都知道StringBuilder类的效率要比String类高,但是高多少没有具体的概念。本文通过一个测试程序来为大家呈现String和StringBuilder在效率上的差异。一、String和StringBuilder的底层区别
在.NET中String是不可变字符串,而StringBuilder是可变字符串。程序中对String对象的连接、插入等操作都是在内存中产生另外一个字符串,然后由.NET的垃圾回收机制把原来的字符串回收。试想如果对一个长1KB的字符串快速进行1万次的插入,内存中就会重复生成1万个String的对象,且只有最后一个有用。我们知道每一个对象的产生和析构都会消耗不少时间,特别的,1KB的字符串经过1万次的插入至少会占用10,000KB的内存资源,这相当的浪费。为了解决String对象在连接、插入等操作上的缺点,.NET引入了StringBuilder类,StringBuilder是可变长度的,其首先在内存中分配固定的长度,当进行频繁的插入和连接操作时,超出了内存中分配的长度会自动进行扩充,从而有效的节约了内存空间和减少了生成对象的时间。二、效率测试的方法
1.方法分别为String类型的字符串和StringBuilder类型的字符串末尾添加字符串ss,每次重复添加n个,记录n个ss字符串全部添加完成所用时间t1和t2,同一个n值测试三次,取平均值得T1和T2,分析T1和T2的值即可得出String和StringBuilder的效率差别。
2.指标
时间(毫秒数)
3.参数
原始String类型的字符串和StringBuilder类型的字符串的值均为“”;ss="a*8";n分别为5,000,10,000,20,000和5,000,000(n=5,000,000仅测试了StringBuilder类型的字符串)。
三、测试核心代码
//得到测试String所花时间 private int String_Time(int n) { string strceshi=""; int i = 0; //记录开始系统时间 DateTime starttime = DateTime.Now; for (i = 0; i < n; i++) { strceshi += "a*8"; } //记录结束系统时间 DateTime endtime = DateTime.Now; int second = endtime.Second - starttime.Second; int haosecond = endtime.Millisecond - starttime.Millisecond; int xiangcha = second * 1000 + haosecond; return xiangcha; } //得到测试StringBuilder所花时间 private int Stringder_Time(int n) { StringBuilder strceshi = new StringBuilder(); int i = 0; DateTime starttime = DateTime.Now; //记录开始时间 for (i = 0; i < n; i++) { strceshi.Append("a*8"); } DateTime endtime = DateTime.Now; //记录结束时间 int second = endtime.Second - starttime.Second; int haosecond = endtime.Millisecond - starttime.Millisecond; int xiangcha = second * 1000 + haosecond; return xiangcha; }
四、测试结果
测试程序见附1五、结果分析
从测试的结果可以很清楚得看出StringBuilder的效率要比String高很多倍。当n=20,000时,String平均用了253毫秒,而StringBuilder平均用时接近0毫秒;如果对String进行n=5,000,000次的测试,根据以上实测数据估计至少耗时63250毫秒(63.25秒)。63250除以120=527。
从分析可以看出,StringBuilder效率要比String在连接和插入方面高出500多倍,如果再考虑String在内存方面的浪费,StringBuilder的性能要比String高更多倍。因此,在写C#程序的时候,如果要对字符串进行频繁的插入和连接,选择StringBuilder类型字符串可以明显得提高程序的性能。
附1:测试程序
http://download.csdn.net/detail/mytroy/7695821相关文章推荐
- C#基础-058 List集合、HashSet集合、HashTable集合、StringBuilder与String运行效率比较
- C#基础之string与StringBuilder
- C#的StringBuilder 以及string字符串拼接的效率对照
- C#基础-语句、运算符、表达式、String、StringBuilder和字符串编码(Day3)
- C#基础系列(7)-- 第二部分 字符串相关 -- string与StringBuilder(2)
- 测试下String和StringBuilder的效率
- C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
- 30天C#基础巩固------this,base,string中的方法,StringBuilder性能
- StringBuilder 与string 执行替换时的效率测试
- C#转换为String的效率测试
- C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
- C#使用String和StringBuilder运行速度测试及各自常用方法简介
- C#基础----string和stringBuilder
- C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
- C#基础语言运行效率测试报告
- c# 扩展方法奇思妙用基础篇二:string 常用扩展
- C#基础之String篇
- C#字符串处理(String与StringBuilder)
- string 和 StringBuilder的效率对比
- String、StringBuffer、StringBuilder的性能测试