c 拼接字串陣列 C 字串拼接

2021-10-16 15:51:01 字數 2004 閱讀 2272

測試環境:unity2018.4;.net4.x。需要注意.net4.x和3.5差異還是挺大的

寫的內容大部分網上已有,算是總結他人的成果,是**。

1、先說幾條結論:

1_1、字串在c#中是高頻出現的

1_2、這類高頻出現方法、字段通常不是每幀的效能瓶頸。但有可能是瞬間卡頓的**。

1_3、字串記憶體開銷計算:26b(基礎開銷) + string.length * sizeof(char)。如字串「1」:28b開銷

1_4、值型別,與字串拼接不要偷懶,記得加上.tostring();

1_5、字串拼接應盡量控制在4個以內

1_6、解決1_5中的問題

2、解釋。

2_1、因為system.object這個c#醉基礎的類都有tostring();方法,其必然是個通用且極易出現的東西。

2_2、乙個非常非常基礎的東西如果存在效能問題,其上下文很有可能有問題或很可能存在更大的效能問題。如呼叫次數過高等。

2_3、此處是基礎,且自己可能很輕鬆推算出。

2_4、開始正式聊c#字串的拼接了。

2_4_1、即string.concat方法,其內部有兩類方法即string.concat(string, string);和string.concat(object, object);

2_4_2、string + string就不用說了,字串拼接是字串 + 字串很合理。object + object同樣也容易理解,字串拼接時其引數可以是五花八門,且tostring()是system.object內的方法,所以用object來承載引數是很合理的。它相當於string.concat(object, object) -> string.concat(object.tostring(), object.tostring());

2_4_3、那就意味著,值型別 + 字串會走string.concat(object, object);就以1 + "abc"為例

2_4_4、那首先,值型別 -> object存在一次裝箱,以int型別為例,其記憶體開銷為16b + sizeof(int)。即20b的開銷,自然其也有cpu開銷【但先忽略,因為其很低】。

2_4_5、其次object(1) -> string時,c#會生成字串"1",即28b開銷。

2_4_6、最終結果為"1abc",即34b開銷。過程中共產生82b開銷

2_4_7、如果寫成1.tostring() + "abc"呢?首先1.tostring();開銷28b,結果34b,共計62b。

2_4_8、主要問題就出現在值型別轉object時的那次開銷。次要問題,畢竟又多了object -> string開銷。所以無論怎樣,肯定是要加上.tostring();划算

2_5、string.concat過載有很多,但直接傳入的引數最多支援4個,超過4個時,如果是string相加,會走string concat(params string)。

2_5_1、以圖中③處5個字串相加時為例,c#會生成string[5]去容納這些引數,其開銷為32b + sizeof(char*) * 5 = 72。值得一提的是,在.net3.5中,陣列的起始開銷是40b,所以此處在.net3.5中是80b,至於多出的8b是啥呢?可自己查查玩。

2_5_2、當我們真的用工具看其記憶體開銷時,其開銷是180b,這是因為.net4.x中做了執行緒安全處理,即c#會將傳入的string[5]套娃複製一遍,以免出現其他執行緒修改其內容的問題,所以這裡會翻倍變成144b。再加上結果"12345"36b,就是180b

2_5_3、值得一說的是在.net3.5中是沒有執行緒安全這項處理的,所以其最終開銷為80b + 36b = 116b。我tm謝你啊~

2_5_4、回到圖中①處,4個字串相加時34b,5個就飆公升至180b,這裡真的不可謂不坑爹。這也算c#這類以方便換效能所謂高階語言的乙個毛病了。所以絕大多數引擎使用c++寫**是有原因的。

2_5_5、圖中④處,其實並不是好思路,萬一幾個字串長有一萬公尺,那多算的一次result開銷會遠大於2次string[5]陣列。但如果沒有解決的問題,且拼接字串都很短,這個方法可能有點用。但……記憶體碎片的隱患值得嗎?

c 拼接字串陣列 陣列 字串拼接

題目描述輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。public class solution 交換的值不是拼接後的兩個相鄰字串 if before after for int i 0 i...

C 字串拼接顯示

常見的c字串拼接可能就是將條字串拼接在一塊新的記憶體區域內,並得到新記憶體區域的起始位址,這類操作可以自己寫,也可以使用c庫函式 c c extern char strcat const char dest,const char src 將src字串新增到dest字串末尾,並返回dest位址 但是此...

c 字串拼接效率

1 對於少量固定的字串拼接,如string s a b c 系統會優化成s string.concat a b c 不會新建多個字串。如果寫成string s a s b s c 則會建立三個新的字串。可見,它和stringbuilder有著相似的效率,比用 的拼接方式高效,並且 易於閱讀。stri...