.Net字符暫存池的示例分析

這篇文章將為大家詳細(xì)講解有關(guān).Net字符暫存池的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供麻章網(wǎng)站建設(shè)、麻章做網(wǎng)站、麻章網(wǎng)站設(shè)計(jì)、麻章網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、麻章企業(yè)網(wǎng)站模板建站服務(wù),十余年麻章做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

.Net字符暫存池的示例分析

字符串在.Net中既有值類型的特點(diǎn)又有引用類型的特點(diǎn),字符類型也稱作為不可變對象類型,字符串類型在使用上可以說占很大的比例,每次使用的時(shí)候都要重新開辟一個(gè)新的空間,這樣會大量消耗內(nèi)存,所以微軟給我們一個(gè)名為String Intern Pool的字符暫存池,我在重復(fù)使用這個(gè)字符串的時(shí)候不需要重新開辟一個(gè)新的空間,只需要從這個(gè)池子里面獲取即可。

我們在新建一個(gè)字符的時(shí)候,首先去暫存池獲取有沒有這個(gè)字符,如果沒有則把這個(gè)新的字符串保存到暫存池。

下面是string類的兩個(gè)方法

        //        // 摘要:        //     檢索系統(tǒng)對指定 System.String 的引用。        //        // 參數(shù):        //   str:        //     要在暫存池中搜索的字符串。        //        // 返回結(jié)果:        //     如果暫存了 str,則返回系統(tǒng)對其的引用;否則返回對值為 str 的字符串的新引用。        //        // 異常:        //   T:System.ArgumentNullException:        //     str 為 null。        [SecuritySafeCritical]        public static String Intern(String str);        //        // 摘要:        //     檢索對指定 System.String 的引用。        //        // 參數(shù):        //   str:        //     要在暫存池中搜索的字符串。        //        // 返回結(jié)果:        //     如果 str 在公共語言運(yùn)行時(shí)的暫存池中,則返回對它的引用;否則返回 null。        //        // 異常:        //   T:System.ArgumentNullException:        //     str 為 null。        [SecuritySafeCritical]        public static String IsInterned(String str);

字符串暫存池(intern pool)其實(shí)是一張哈希表,鍵是字符串字面量,值是托管堆上字符串對象的引用。在加載程序集時(shí),不同版本的CLR對于是否留用程序集元數(shù)據(jù)中的字符串字面量(在編譯時(shí)值已確定)不盡相同。

我們在給string類型變量分配字面量值時(shí),CLR會先到字符串池中看下有沒有完全相同的字符串(區(qū)分大小寫),若有則返回對應(yīng)的引用,若無,則創(chuàng)建新對象并添加到字符串池中返回引用。但若在運(yùn)行時(shí)(如,使用new關(guān)鍵字)來給字符串變量分配值則不會使用字符串池。

string a = "abc";string b = "abc";string c = new string(new char[] { 'a', 'b', 'c' });
Console.WriteLine(a.Equals(b));Console.WriteLine(a.Equals(c));
Console.WriteLine(object.ReferenceEquals(a, b));//trueConsole.WriteLine(object.ReferenceEquals(a, c));//false

下面我們針對這個(gè)來測試一波性能

1.測試十萬條數(shù)據(jù)字符拼接

2.測試不同字符串拼接

3.測試相同字符拼接

代碼如下:

//針對相同字符拼接Stopwatch sw1 = new Stopwatch();string a = "a";string b = string.Empty;sw1.Start();for (int i = 0; i < 100_000; i++){    b += a;}sw1.Stop();Console.WriteLine($"相同字符拼接消耗時(shí)間={sw1.ElapsedMilliseconds}");//針對不同字符拼接Stopwatch sw2 = new Stopwatch();string c = string.Empty;sw2.Start();for (int i = 0; i < 100_000; i++){    //i.ToString();    c += i.ToString();}sw2.Stop();Console.WriteLine($"不同字符拼接消耗時(shí)間={sw2.ElapsedMilliseconds}");//檢測裝箱的時(shí)間Stopwatch sw3 = new Stopwatch();string d = string.Empty;sw3.Start();for (int i = 0; i < 100_000; i++){    i.ToString();}sw3.Stop();Console.WriteLine($"檢測裝箱消耗的時(shí)間{sw3.ElapsedMilliseconds}");

結(jié)果如下

相同字符拼接消耗時(shí)間=1695不同字符拼接消耗時(shí)間=26925檢測裝箱消耗的時(shí)間12

總結(jié):net中的字符串存在方式多種多樣,我們要分清是運(yùn)行是創(chuàng)建還是編譯時(shí)創(chuàng)建,我們在程序中,經(jīng)常會用到字符串類型,對于我們常用的字符串應(yīng)該使用常量來定義,以保證它的復(fù)用性。

關(guān)于“.Net字符暫存池的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

新聞名稱:.Net字符暫存池的示例分析
網(wǎng)站鏈接:http://muchs.cn/article48/ihiehp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站策劃、建站公司網(wǎng)站導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名