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


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什


