国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

淺析C#中StringBuilder類的高效及與String的對比

2020-01-24 01:09:34
字體:
來源:轉載
供稿:網友

在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();}

上面代碼執行的效果如下:

2016518151713376.png (323×59)

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要高,但是前提是使用頻率比較高的情況下.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽阳市| 万源市| 墨江| 合水县| 加查县| 洛浦县| 凌海市| 昌邑市| 广宗县| 鄂尔多斯市| 白银市| 德化县| 安义县| 上杭县| 休宁县| 长治市| 银川市| 远安县| 建湖县| 青铜峡市| 龙里县| 慈利县| 阳原县| 清原| 榆社县| 明水县| 邵东县| 房产| 高安市| 宜阳县| 台前县| 澄迈县| 甘孜县| 云阳县| 沂源县| 苗栗市| 镇巴县| 卢龙县| 阜新市| 新沂市| 中牟县|