淺析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(); }
上面代碼執(zhí)行的效果如下:
string類型的特別之處在于我們可以像使用值類型那樣使用string類型,而實際上string是引用類型。既然是引用類型,CLR就會把string類型保存在托管堆上。當(dāng)我們使用str1 = str1 + i.ToString();進(jìn)行拼接,由于string類型的恒定性,不會改變str1在內(nèi)存中的地址,而是在托管堆上創(chuàng)建了另外一個字符串對象。如此,拼接10000次,就創(chuàng)建了10000個string類型對象,效率難免低下。
而StringBuilder會在內(nèi)存中開辟一塊連續(xù)的內(nèi)存,當(dāng)增加字符串實際上是針對同一塊內(nèi)存的修改,所以效率更高。
當(dāng)然,到底使用硬拼接字符串,還是使用StringBuilder,不是絕對的,要看情況。當(dāng)拼接字符串很少的情況下,當(dāng)然直接硬拼接字符串就行了。
深入string和stringBuilder的區(qū)別
String對象是不可改變的。每次使用System.String類中的方法之一或者是進(jìn)行運(yùn)算時(如賦值、拼接等),都要在內(nèi)存中創(chuàng)建一個新的字符串對象,這就需要為該新對象分配內(nèi)存空間,而StringBuilder則不會。在需要對字符串執(zhí)行重復(fù)修改操作時,與創(chuàng)建新的 String 對象相關(guān)的系統(tǒng)開銷可能會非常昂貴。如果要修改字符串而不創(chuàng)建新的對象,則可以使用 System.Text.StringBuilder 類。例如,當(dāng)在一個循環(huán)中將許多字符串連接在一起時,使用 StringBuilder 類可以提升性能。
String類型對象的特點:
1.它是引用類型,在堆上分配內(nèi)存
2.運(yùn)算時會產(chǎn)生一個新的實例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運(yùn)算符(== 和 !=)是為了比較 String 對象的值(而不是引用)
大家都知道字符串對象是”不可變的”,
對字符串進(jìn)行操作的方法實際上返回的是新的字符串對象。
在前面的示例中,將 s1 和 s2 的內(nèi)容連接起來以構(gòu)成一個字符串時,包含 "orange" 和 "red" 的兩個字符串均保持不變。+= 運(yùn)算符會創(chuàng)建一個包含組合內(nèi)容的新字符串。結(jié)果是 s1 現(xiàn)在引用一個完全不同的字符串。只包含"orange" 的字符串仍然存在,但連接 s1 后將不再被引用。
大量的字符串相加的時候就會有很多想s1一樣的 不在被引用,從而造成資源的極大浪費.
大家注意這點
string stringValue = this.m_StringValue; internal volatile string m_StringValue;
寫到這里,需要有人見看到了 volatile,也許不明白是什么意思,大概的說下.
volatile關(guān)鍵字實現(xiàn)了線程間數(shù)據(jù)同步,用volatile修飾后的變量不允許有不同于”主”內(nèi)存區(qū)域的變量拷貝。
換句話說,一個變量經(jīng)volatile修飾后在所有線程中必須是同步的;任何線程中改變了它的值,所有其他線程立即
獲取到了相同的值。理所當(dāng)然的,volatile修飾的變量存取時比一般變量消耗的資源要多一點,因為線程有它自己的
變量拷貝更為高效。
this.NeedsAllocation(stringValue, requiredLength)
只有在需要的時候才去重新分配.
就分配空間和線程的使用上來講,StringBuilder肯定比String要高,但是前提是使用頻率比較高的情況下.
上一篇:C# 函數(shù)覆蓋總結(jié)學(xué)習(xí)(推薦)
欄 目:C#教程
本文標(biāo)題:淺析C#中StringBuilder類的高效及與String的對比
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6511.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)由四周向中心縮小的窗體退出特效
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#中DataGridView常用操作實例小結(jié)
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#利用反射技術(shù)實現(xiàn)去掉按鈕選中時的邊框效果
- 01-10C#中查找Dictionary中的重復(fù)值的方法
- 01-10C#中TreeView實現(xiàn)適合兩級節(jié)點的選中節(jié)點方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什