Unity中的string gc優化


在項目中如果有大量的字符串拼接,比如每秒執行的倒計時,協議中的日志輸出,每次拼接會產生大量的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的+=

對於參數的傳遞,可以傳入引用類型,就不需要每次都構建一個新的對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM