淺析C#中StringBuilder類的高效及與String的比較。本站提示廣大學習愛好者:(淺析C#中StringBuilder類的高效及與String的比較)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析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對象是弗成轉變的。每次應用System.String類中的辦法之一或許是停止運算時(如賦值、拼接等),都要在內存中創立一個新的字符串對象,這就須要為該新對象分派內存空間,而StringBuilder則不會。在須要對字符串履行反復修正操作時,與創立新的 String 對象相干的體系開支能夠會異常昂貴。假如要修正字符串而不創立新的對象,則可使用 System.Text.StringBuilder 類。例如,當在一個輪回中將很多字符串聯接在一路時,應用 StringBuilder 類可以晉升機能。
String類型對象的特色:
1.它是援用類型,在堆上分派內存
2.運算時會發生一個新的實例
3.String 對象一旦生成弗成轉變(Immutable)
4.界說相等運算符(== 和 !=)是為了比擬 String 對象的值(而不是援用)
年夜家都曉得字符串對象是”弗成變的”,
對字符串停止操作的辦法現實上前往的是新的字符串對象。
在後面的示例中,將 s1 和 s2 的內容銜接起來以組成一個字符串時,包括 "orange" 和 "red" 的兩個字符串均堅持不變。+= 運算符會創立一個包括組合內容的新字符串。成果是 s1 如今援用一個完整分歧的字符串。只包括"orange" 的字符串依然存在,但銜接 s1 後將不再被援用。
年夜量的字符串相加的時刻就會有許多想s1一樣的 不在被援用,從而形成資本的極年夜糟蹋.
年夜家留意這點
string stringValue = this.m_StringValue; internal volatile string m_StringValue;
寫到這裡,須要有人見看到了 volatile,或許不明確是甚麼意思,年夜概的說下.
volatile症結字完成了線程間數據同步,用volatile潤飾後的變量不許可有分歧於”主”內存區域的變量拷貝。
換句話說,一個變量經volatile潤飾後在一切線程中必需是同步的;任何線程中轉變了它的值,一切其他線程立刻
獲得到了雷同的值。天經地義的,volatile潤飾的變量存取時比普通變量消費的資本要多一點,由於線程有它本身的
變量拷貝更加高效。
this.NeedsAllocation(stringValue, requiredLength)
只要在須要的時刻才去從新分派.
就分派空間和線程的應用下去講,StringBuilder確定比String要高,然則條件是應用頻率比擬高的情形下.