字串是我們常用的基礎資料型別,如果使用不當,養成不好的習慣,會對程式造成額外的開銷。
建議:確保盡量少的裝箱
避免分配額外的記憶體空間
確保盡量少的裝箱
1:string str1 = "str1" + 9;
2:string str2 = "str2" + 9.tostring();
第一行**需要執行一次裝箱行為int 轉 object 轉 string
第二行**不需要執行裝箱,呼叫的是整形的tostring方法,直接從記憶體中進行轉換,效率要比裝箱高很多。
所以在使用值引用型別到字串的轉換並完成拼接時,應當避免使用操作符「+」來完成,而應該使用值引用型別提供的tostring方法。
裝箱之所以會帶來效能耗損,因為它需要完成下面的三個步驟:
1.首先,會為值型別在託管堆中分配記憶體。除了值型別本身所分配的記憶體外,記憶體總量還要加上型別物件指標和同步塊索引占用的記憶體。
2.將值型別的值複製到新分配的堆記憶體中。
3.返回已經成為引用型別的物件的位址。
避免分配額外的記憶體空間
string物件是乙個很特殊的物件,一旦賦值就不可改變。在執行時呼叫string類中的任何方法或進行任何運算(如「=」賦值、「+」拼接等),都會在記憶體中建立乙個新的字串物件,這也意味著要為新物件開闢乙個新的記憶體空間。 如:
string s1="abc"+"def"; //改**等效於 s1="abcdef"
s1="123"+s1+"456";
//以上**建立了3個字串物件
const string a="t";
string re1="abc"+a;
// 因為a是乙個常量,所以該**等效於 re1="abct";
微軟針對這種情況提供了stringbuilder來彌補。
stringbuilder不會重新建立乙個string物件,他的效率源於預先以非託管的方式分配記憶體。如果沒有定義長度,預設分配長度為16,實際長度小於16時不會重新分配記憶體,實際長度大於16小於32時,stringbuilder又會重新分配記憶體,使之成為16的倍數。
string a = "t";
string b = "e";
string c = "s";
string d = "t";
stringbuilder build = new stringbuilder(a);
另外,微軟還提供了一種簡化寫法,使用string.format方法,內部使用stringbuilder進行字串格式化。
string a = "t";string b = "e";
string c = "s";
string d = "t";
string.format("", a, b, c, d);
建議1 正確操作字串
建議1 正確操作字串 字串應該是所有程式語言中使用最頻繁的一種基礎資料型別。如果使用不慎,我們就會為一次字串的操作所帶來的額外效能開銷而付出代價。本條建議將從兩個方面來 如何規避這類效能開銷 先來介紹第乙個方面,請看下面的兩行 string str1 str1 9 string str2 str2 ...
字串操作 1
a 大串中查詢子串出現的次數 public class substringdemo 方式2 不擷取字串,逐漸縮小查詢範圍 private static intgetcount2 string str,string regex return count 方式1 查詢到小串後將已經查詢的部分擷取掉。返回...
C 中如何正確的操作字串?
字串應該是所有程式語言中使用最頻繁的一種基礎資料型別。如果使用不慎,我們就會為一次字串的操作所帶來的額外效能開銷而付出代價。本條建議將從兩個方面來 如何規避這類效能開銷 1.確保盡量少的裝箱 2.避免分配額外的記憶體空間。第乙個方面 確保盡量少的裝箱 對於裝拆箱,我們應該不陌生,值型別轉換成引用型別...