最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年05月18日 15:25:49   作者:吉吉于  
StringBuilder類所創(chuàng)造出來的字符串對象在拼接操作等方面比普通的string類往往要高效很多,這是它們在內(nèi)存劃分方式上的不同所決定的,下面就來淺析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í)行的效果如下:

2016518151713376.png (323×59)

string類型的特別之處在于我們可以像使用值類型那樣使用string類型,而實際上string是引用類型。既然是引用類型,CLR就會把string類型保存在托管堆上。當(dāng)我們使用str1 = str1 + i.ToString();進行拼接,由于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類中的方法之一或者是進行運算時(如賦值、拼接等),都要在內(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.運算時會產(chǎn)生一個新的實例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運算符(== 和 !=)是為了比較 String 對象的值(而不是引用)

大家都知道字符串對象是”不可變的”,
對字符串進行操作的方法實際上返回的是新的字符串對象。
在前面的示例中,將 s1 和 s2 的內(nèi)容連接起來以構(gòu)成一個字符串時,包含 "orange" 和 "red" 的兩個字符串均保持不變。+= 運算符會創(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要高,但是前提是使用頻率比較高的情況下.

相關(guān)文章

  • C#調(diào)用js庫的方法小結(jié)

    C#調(diào)用js庫的方法小結(jié)

    本文主要介紹了C#調(diào)用js庫的方法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C# Winform窗口之間傳值的多種方法淺析

    C# Winform窗口之間傳值的多種方法淺析

    這篇文章主要介紹了C# Winform窗口之間傳值的多種方法淺析,本文起講解了通過構(gòu)造器傳值、通過屬性傳遞、通過事件攜帶參數(shù)傳遞等方法,需要的朋友可以參考下
    2015-04-04
  • 一文詳解C#?Chart控件

    一文詳解C#?Chart控件

    這篇文章主要介紹了一文學(xué)習(xí)C#?Chart控件,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • C#程序優(yōu)化-有效減少CPU占用率

    C#程序優(yōu)化-有效減少CPU占用率

    本文給大家介紹的是C#程序優(yōu)化的小技巧,通過此方法可以有效的降低CPU的占用率,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-06-06
  • c# 繪制中國象棋棋盤與棋子

    c# 繪制中國象棋棋盤與棋子

    這篇文章主要介紹了c# 繪制中國象棋棋盤與棋子,文中實例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#使用windows服務(wù)發(fā)送郵件

    C#使用windows服務(wù)發(fā)送郵件

    這篇文章主要為大家詳細介紹了C#使用windows服務(wù)發(fā)送郵件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C#交錯數(shù)組知識點分析

    C#交錯數(shù)組知識點分析

    在本篇文章里小編給大家整理的是關(guān)于C#交錯數(shù)組知識點分析,需要的朋友們參考下。
    2019-11-11
  • C#之IP地址和整數(shù)互轉(zhuǎn)的小例子

    C#之IP地址和整數(shù)互轉(zhuǎn)的小例子

    C#之IP地址和整數(shù)互轉(zhuǎn)的小例子,需要的朋友可以參考一下
    2013-03-03
  • WPF實現(xiàn)動畫效果(三)之時間線(TimeLine)

    WPF實現(xiàn)動畫效果(三)之時間線(TimeLine)

    這篇文章介紹了WPF實現(xiàn)動畫效果之時間線(TimeLine),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#實現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法

    C#實現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法

    這篇文章主要介紹了C#實現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法,涉及C#數(shù)組與字符串的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-08-08

最新評論

庆元县| 大渡口区| 东源县| 秦安县| 原阳县| 临江市| 常德市| 北辰区| 临朐县| 呼伦贝尔市| 蓝田县| 五指山市| 邯郸县| 云和县| 雷波县| 肥西县| 平果县| 左贡县| 连江县| 寿阳县| 白城市| 黄骅市| 宁德市| 榆树市| 枞阳县| 遂昌县| 北辰区| 富宁县| 多伦县| 清水县| 黄梅县| 明光市| 格尔木市| 苏尼特左旗| 方正县| 宾川县| 岳阳市| 灵璧县| 白沙| 衡阳市| 元氏县|