中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-12-20 11:41:16 來源:億速云 閱讀:158 作者:小新 欄目:大數據

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

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

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

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

下面是string類的兩個方法

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

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

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

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

下面我們針對這個來測試一波性能

1.測試十萬條數據字符拼接

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($"相同字符拼接消耗時間={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($"不同字符拼接消耗時間={sw2.ElapsedMilliseconds}");//檢測裝箱的時間Stopwatch sw3 = new Stopwatch();string d = string.Empty;sw3.Start();for (int i = 0; i < 100_000; i++){    i.ToString();}sw3.Stop();Console.WriteLine($"檢測裝箱消耗的時間{sw3.ElapsedMilliseconds}");

結果如下

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

總結:net中的字符串存在方式多種多樣,我們要分清是運行是創建還是編譯時創建,我們在程序中,經常會用到字符串類型,對于我們常用的字符串應該使用常量來定義,以保證它的復用性。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平远县| 巩留县| 礼泉县| 五峰| 玉林市| 黄梅县| 库尔勒市| 虹口区| 博罗县| 从江县| 延津县| 韶关市| 江北区| 潞西市| 祥云县| 乐平市| 五峰| 肇州县| 宜君县| 宜章县| 贺兰县| 兴文县| 乐东| 龙泉市| 潮安县| 两当县| 青海省| 额济纳旗| 罗山县| 桃源县| 横峰县| 电白县| 潼南县| 双城市| 资溪县| 兴业县| 东阳市| 平定县| 隆德县| 楚雄市| 武鸣县|