日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net字符暂存池(String Intern Pool)

發布時間:2025/3/17 asp.net 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net字符暂存池(String Intern Pool) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字符串在.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));//true Console.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

一名正在搶救的coder

筆名:mangolove

CSDN地址:https://blog.csdn.net/mango_love

GitHub地址:https://github.com/mangoloveYu

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的.Net字符暂存池(String Intern Pool)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。