浅析C#中StringBuilder类的高效及与String的对比
在C#中,在处理字符串拼接的时候,使用StringBuilder的效率会比硬拼接字符串高很多。到底有多高,如下: static void Main( string[] args ) { string str1 = string.Empty; Stopwatch sw1 = new Stopwatch(); sw1.Start(); for ( int i = 0; i < 10000; i++ ) { str1 = str1 + i.ToString(); } sw1.Stop(); Console.WriteLine( "拼接字符串所耗费时间为:" + sw1.ElapsedMilliseconds + "毫秒" ); StringBuilder str2 = new StringBuilder( 10000 ); Stopwatch sw2 = new Stopwatch(); sw2.Start(); for ( int i = 0; i < 10000; i++ ) { str2.Append( i.ToString() ); } sw2.Stop(); Console.WriteLine( "使用StringBuilder所耗费时间为:" + sw2.ElapsedMilliseconds + "毫秒" ); Console.ReadKey(); } 上面代码执行的效果如下: string类型的特别之处在于我们可以像使用值类型那样使用string类型,而实际上string是引用类型。既然是引用类型,CLR就会把string类型保存在托管堆上。当我们使用str1 = str1 + i.ToString();进行拼接,由于string类型的恒定性,不会改变str1在内存中的地址,而是在托管堆上创建了另外一个字符串对象。如此,拼接10000次,就创建了10000个string类型对象,效率难免低下。 而StringBuilder会在内存中开辟一块连续的内存,当增加字符串实际上是针对同一块内存的修改,所以效率更高。 当然,到底使用硬拼接字符串,还是使用StringBuilder,不是绝对的,要看情况。当拼接字符串很少的情况下,当然直接硬拼接字符串就行了。 深入string和stringBuilder的区别 String类型对象的特点: 大家都知道字符串对象是”不可变的”, string stringValue = this.m_StringValue; internal volatile string m_StringValue; 写到这里,需要有人见看到了 volatile,也许不明白是什么意思,大概的说下. this.NeedsAllocation(stringValue,requiredLength) 只有在需要的时候才去重新分配. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |