转自:http://blog.csdn.net/lyh916/article/details/52194998
参考链接:
http://www.cnblogs.com/mrkelly/p/5391156.html#3415238
http://www.cnblogs.com/murongxiaopifu/p/4284988.html#GC
一.减少使用foreach
首先回顾一下IEnumerable和IEnumerator
1 2 3 4 |
public interface IEnumerable { IEnumerator GetEnumerator(); } |
1 2 3 4 5 6 |
public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); } |
如果一个集合要使用foreach进行遍历,那么需要实现IEnumerable这个接口。
下面回到正题,测试一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
using UnityEngine; using System.Collections; using System.Collections.Generic; public class TestCSharp : MonoBehaviour { private List<int> list = new List<int>(); private Dictionary<int, int> dict = new Dictionary<int, int>(); private int sum; void Start () { for (int i = 0; i < 1000; i++) { list.Add(i); dict.Add(i, i); } sum = 0; Profiler.BeginSample("ForList"); for (int i = 0; i < list.Count; i++) { sum += i; } Profiler.EndSample(); Debug.Log(sum); sum = 0; Profiler.BeginSample("ForeachList"); foreach (var item in list) { sum += item; } Profiler.EndSample(); Debug.Log(sum); sum = 0; Profiler.BeginSample("EnumeratorList"); var listEnumerator = list.GetEnumerator(); while (listEnumerator.MoveNext()) { sum += listEnumerator.Current; } Profiler.EndSample(); Debug.Log(sum); /////////////////////////////////////////////////////////////// sum = 0; Profiler.BeginSample("ForDict"); //字典可以看作两个list,一个list存key,一个list存value //两个list是一一对应的关系 List<int> keys = new List<int>(dict.Keys); for (int i = 0; i < dict.Count; i++) { sum += dict[keys[i]]; } Profiler.EndSample(); Debug.Log(sum); sum = 0; Profiler.BeginSample("ForeachDict"); foreach (var item in dict) { sum += item.Value; } Profiler.EndSample(); Debug.Log(sum); sum = 0; Profiler.BeginSample("EnumeratorDict"); var dictEnumerator = dict.GetEnumerator(); while (dictEnumerator.MoveNext()) { sum += dictEnumerator.Current.Value; } Profiler.EndSample(); Debug.Log(sum); } } |
结论:从gc和速度来看,使用GetEnumerator()来遍历集合是最好的。这里我建议使用for遍历list,使用GetEnumerator遍历字典。
- 本文固定链接: http://www.u3d8.com/?p=1107
- 转载请注明: 网虫虫 在 u3d8.com 发表过
我是初学者,为什么报错"当前上下文中不存在Profiler"
只要using UnityEngine 就可以使用Profier啊,对了。我用的版本是5.3.0。
5.6 的话 dic list 都不会有gc了