Unity中的string gc優化
阿新 • • 發佈:2020-11-04
在專案中如果有大量的字串拼接,比如每秒執行的倒計時,協議中的日誌輸出,每次拼接會產生大量的gc,尤其是在ILRuntime下執行 gc alloc的次數會更加頻繁。
zstring
有兩個字串處理的庫都叫zstring,其中小寫的zstring是一款國人開源的zstring,而大寫的ZString是日本的CySharp公司的
國人的zstring:https://github.com/871041532/zstring
ZString:https://github.com/Cysharp/ZString
經測試zstring在update中是0gc,而ZString還有gc,短字串處理,會比原生string慢一些,我的測試環境:Unity2019.3.4f1
gc分配值:string >ZString >zstring
執行耗時:zstring >ZString >string
易用性:string>zstring>ZString
測試程式碼
void Update() { Profiler.BeginSample("zstring=============concat"); ZString.Concat("abc", 1); Profiler.EndSample(); Profiler.BeginSample("string=============concat"); string.Concat("abc", 1); Profiler.EndSample(); Profiler.BeginSample("cn-zstring=============concat"); using (zstring.Block()) { zstring.Concat("abc",1); } Profiler.EndSample(); Profiler.BeginSample("zstring=============format"); ZString.Format("hello,{0}",1111); Profiler.EndSample(); Profiler.BeginSample("string=============format"); string.Format("hello,{0}",1111); Profiler.EndSample(); Profiler.BeginSample("cn-zstring=============format"); using (zstring.Block()) { zstring.Format("hello ,{0}",1111); } Profiler.EndSample(); }
ZString和string gc對比
Method | Allocated(B) | Mean(ns) | Mean(ns) | |||
---|---|---|---|---|---|---|
StringPlus | 224 | 126.66 | 126.66 | |||
ZStringConcat | 56 | 96.95 | 96.95 | |||
StringFormat | 128 | 158.21 | 158.21 | |||
ZStringFormat | 56 | 185.36 | 185.36 | |||
StringBuilder | 296 | 144.2 | 144.2 | |||
ZStringBuilder | 56 | 131.68 | 131.68 |
結論
個人而言更傾向於使用國人開發的zstring,它只有一個程式碼檔案,放Plugins目錄下就可以使用,相對而言上手更容易
Unity的建議
關於記憶體管理可看這篇: https://docs.unity3d.com/cn/current/Manual/UnderstandingAutomaticMemoryManagement.html
其中有條建議,對於需要頻繁拼接的字串,先判斷字串是否有變化,無變化則不需要拼接
對於字串的拼接,使用stringbuilder代替string,同時我也建議使用zstring代替string的+=
對於引數的傳遞,可以傳入引用型別,就不需要每次都構建一個新的物件