嗚嗚喔學習筆記: 八月 2020

搜尋此網誌

2020年8月6日 星期四

LINQ&GC&Lamda ( Linq效能的坑 )

為什麼使用 Linq 有時候發現效能不是很好,特別會多出來一些GC量。

( 特別是再做手機遊戲的人,GC 造成的卡頓會特別明顯 )

原因 :

C# 在 new Object 之後,會經過GC回收,所以要避免一直new Object, 這樣會給GC比較大的壓力。

 

舉個栗子 : 簡單的查找


一個使用For 迴圈查找 

一個使用Linq 查找


Lamda 表達式是一個語法糖,經過編譯後 會轉換為下面程式碼:


這裡可以查看 : https://reurl.cc/kd4n4n


轉換前:

轉換後 :

可以明顯看到編譯後的程式碼 

使用Linq 方式他會創見一個 Class &  new Object, 所以他會被GC。(因該要避免)

而且因為在Lamda裡出現的變數都會 "都會變成新Class理的成員", 新Class的成員越多,也就等於GC量越大~ 所以也要小心使用~


結語:


Linq & Lamda 很好用很直覺,但 *不要在迴圈中使用* *不要在Update()中使用* 會產生很多GC !! 請堅持偶爾用用沒關西的原則使用,不要一直用一直爽~