騰訊C#腳本GC測試真相

string使用+號拼接 和 stringbuilder

void testStringBuilder_plus()

{

 string test = "abc" + "efg" + "h";

int index = test.Length;

}

 

void testStringBuilder_StringBuilder()

{

StringBuilder testData = new StringBuilder();

testData.Append("abc");

testData.Append("efg");

testData.Append("h");

string test = testData.ToString();

}

 

數據結論

不同的使用場景結果是不同的,+ 號在幾次連接中沒有產生 GC。而在大量的連

接過程中,產生大量的 GC。

意義

連接次數只有幾次(10 以內),此時應該直接用 + 號連接,不產生 GC。實際

上,編譯器已經做了優化。

其餘的使用 StringBuilder,StringBuilder 內部 Buffer 的缺省值爲 16,

按 StringBuilder 的使用場景,Buffer 肯定得重新分配。經驗值一般用 256 作

爲 Buffer 的初值。當然,如果能計算出最終生成字符串長度的話,則應該按這

個值來設定 Buffer 的初值。使用 new StringBuilder(256) 就將 Buffer 的初始

長度設爲了 256。

struct 和 class 比較

數據結論

Struct 在棧中不產生 GC,class 在堆中,會產生 GC。

對 Struct 的結點修改時,修改完以後記得重新賦值。因爲 Struct 賦值是 copy

而不是引用,修改完以後,以前的不生效。

意義

堆棧的空間有限,對於大量的邏輯的對象,創建類要比創建結構好一些。

結構表示輕量對象,並且結構的成本較低,適合處理大量短暫的對象。

在表現抽象和多級別的對象層次時,類是最好的選擇。

大多數情況下該類型只是一些數據時,結構是最佳的選擇。

Enum 真相

數據結論

TestStr() 有裝箱發生。

TestDic(),在構造集合的時候,也會有 GC 的產生。

意義

不要把枚舉當 Tkey 使用,不要把枚舉轉成 string 使用。

 

協成

Component 相關優化

Transform

使用內建的數組,比如用 Vector3.zero 而不是 new Vector(0, 0, 0);

transform.localRotation = Quaternion.Euler(Vector3.zero);

transform.localScale =Vector3.one;

transform.localPosition =Vector3.one;

GameObject 相關優化

(腳本和本地引擎 C++代碼之間的通信開銷)

Gameobject 緩存:類似組件的緩存策略。

查找對象標籤:if (go.CompareTag (“xxx”)來代替 if (go.tag == “xxx”),

因爲內部循環調用對象分配的標籤屬性以及拷貝額外內存。

SendMessageUpwards、SendMessage:少用這兩個函數,使用委託替代。

緩存組件:調用 GetComponent 函數耗性能,用變量先緩存到內存在使用, 有

必要時記得更新緩存組件。

未完待續.................

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章