您的位置:首页 > 产品设计 > UI/UE

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: