字串留用與字串池

2022-01-14 15:28:48 字數 2294 閱讀 5890

1、關於字串操作對應用程式效能的影響

字串相等性檢查是應用程式常見的操作,於此同時,這也是一種嚴重損害效能的操作.執行序號(字串的二進位制)相等行檢查時,clr會進行以下操作:

1、判斷字串的長度是否相等,不相等,比較結果直接返回false,如果相等,繼續下一步操作

2、比較字串的長度相等,clr會比較每個單獨的字元才能最終確定。而執行對語言文化敏感的比較時,clr必須比較所   有單獨的字元,因為字串即使長度不同也可能相等.

2、字串留用  一  減少複製相同字串例項對記憶體的消耗

因為字串的不可變性,如果應用程式經常對字串進行區分大小寫的序號比較,這個時候如果你知道有許多字串會有相同的值,那麼就可以利用clr的"字串留用"機制來提公升應用程式的效能.

原理:只儲存相同字串的乙個例項來提公升記憶體的利用率。將相同的字串變數引用都指向乙個字串物件.

3、clr實現字串留用的過程

clr初始化時會建立乙個內部雜湊表.在這個表中,鍵(key)是字串,而值(value)是對託管堆中的string物件的引用.這個過程類似與四、clr執行程式集中**和il**簡介 clr第一次執行乙個方法的過程類似,它會初始化乙個內部結構,生成一系列的位址,位址指向jitcomliler函式,該函式會將**轉成cpu指令等操作,並返回結果給呼叫的c#方法.

注:該雜湊表最開始是空的.

string類提供了兩個方法便於你訪問這個內部雜湊表:

(1)、intern方法用於獲取乙個string,獲得它的雜湊碼,並在雜湊表中檢查是否有相匹配的,如果存在完全相同的字串,就返回對現有string物件的應用.如果不存在全完相同的字串,就建立字串的副本.將副本新增到內部雜湊表中,返回對該副本的引用.如果應用程式不再保持對原始string物件的引用,這時垃圾**器就會介入,將字串的記憶體強行釋放掉.

(2)isinterned方法也獲取乙個string,並在內部哈西表中查詢它.如果哈西表中有匹配的字串,isinterned方法就返回對這個留用字串物件的應用.但如果沒有,isinterned就返回null,不會將字串新增到雜湊表中.

4、clr預設留用程式集元資料中的字面值字串

程式集載入時,clr預設留用程式集元資料中的描述的所有字面值字串,大微軟知道這個過程可能因為額外的雜湊表查詢而顯著影響效能,所以現在可以禁用此功能.通過對程式集用system.runtime.comiplerservices.compilationrelaxationsattribute進行了標記,並指定了system.runtime.comiplerservices.compilationrelaxations.nostringintering標誌值.那麼根據ecma規範,clr可能選擇不留用指定程式集的元資料定義的所有字串.為了提公升效能,c#編譯器在編譯程式集是總是指定上述連個特性和標誌.

5、clr的4.5班版本及以上選擇忽略4中的特性和標誌,及顯示留用指定字串

string str = "

xiaochao";

string str1 = "

xiaochao";

console.writeline(referenceequals(str,str1));

//輸出:true

//

去內部雜湊表中檢查是否有xiaochao字串,有的話返回該字串的引用,反之,建立該字串的副本,返回該副本的引用.

str =string.intern(str);

//去內部雜湊表中檢查是否有xiaochao字串,發現有xiaochao字串,返回它的引用

str1 =string.intern(str1);

console.writeline(referenceequals(str, str1));

//輸出:true

6、字串池

編譯源**時,編譯器必須處理每個字面值字串,並在託管模組中的元資料中嵌入.同乙個字串在源**中多次出現,如果每次都去記憶體中重複開闢空間,不僅浪費記憶體,而且把它們嵌入元資料會使生成的檔案無謂的增大.

為了解決這個問題,許多編譯器(包括c#編譯器)只在模組的元資料中只將字面值字串至寫入一次,clr預設留用程式集元資料中的字面值字串。引用改字串的所有**都被修改成引用元資料中的同乙個字串.編譯器將單個字串的多個例項合併成乙個例項,能顯著減少模組的大小.c/c++編譯器多年來一直採用這個技術,這個技術被稱為"字串池".

C 字串留用機制與Lock

因為c 的字串留用機制,下面的 string thekey1 string thekey2 if object.referenceequals thekey1,thekey2 thekey1,thekey2指向的是同乙個位址.但下面的 int thea 1 string thekey1 thea s...

ORACLE in 字串,字串,字串

因為傳進來的引數是 字串,字串,字串,要實現in 字串,字串,字串 select from htl price p where p.hotel id 30073328 and p.able sale date between to date 2009 03 27 yyyy mm dd and to ...

字串緩衝池

看到乙個關於字串緩衝池的討論 大家先來看看一段奇怪的程式 public class teststring 這個程式真是簡單啊!可是有什麼問題呢?1.來自 string 的憂慮 上面這段程式中,到底有幾個物件呢?可能很多人脫口而出 兩個,s1 和 s2 為什麼?string 是 final 類,它的值...