参考链接:
http://www.cnblogs.com/mrkelly/p/5391156.html#3415238
http://www.cnblogs.com/murongxiaopifu/p/4284988.html#GC
一.减少使用foreach
首先回顾一下IEnumerable和IEnumerator
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
如果一个集合要使用foreach进行遍历,那么需要实现IEnumerable这个接口。
下面回到正题,测试一下:
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遍历字典。
二.减少使用引用类型
引用类型存放在内存堆上,当引用类型不再被使用时,就会触发gc。
Ps:string是引用类型