C# delegate lambda linq 要注意GC的产生

C#中委托相当于类(不是值类型,而是引用类型),

当做为形参传入的时候 
或者  System.Action b = TestB;//TestB是一个方法,
这样调用一次为产生112bytes的gcalloc
所以我们要避免在update中这样使用。

同理,我们尽量避免使用LINQ语句,因为Linq语句要求我们传入一个委托(delegate)或者方法名,或者lambda表达式。那么GC就产生。

很有可能我们这个LINQ会在排序函数中用到,那么产生的GC就不是一个小数目了。

游戏的卡顿也会跟随着出现。

测试代码:

                List<int> list = new List<int>();
                for(int i = 0; i < 100;i++)
                {
                    list.Add(UnityEngine.Random.Range(0, int.MaxValue));
                }
                int target = 200;

                int resultLinq = 0, resultFor = 0;
                UnityEngine.Profiling.Profiler.BeginSample("MY_TEST LINQ");
                resultLinq = list.Find(i => i == target);
                UnityEngine.Profiling.Profiler.EndSample();

                UnityEngine.Profiling.Profiler.BeginSample("MY_TEST FOR");
                foreach (var i in list)
                {
                    if (i == target)
                    {
                        resultFor = i;
                    }
                }
                UnityEngine.Profiling.Profiler.EndSample();

Profiler结果:看到 gcalloc 产生了

猜你喜欢

转载自blog.csdn.net/PangNanGua/article/details/105412263