简记一波GC优化的实验结论

实验环境:
  • Unity 5.4.6f3 (64-bit)
  • Editor下(非真机,数据会有差异)

内存分配量记录

1. 不使用闭包的委托:104B
  • 由于没有用到upvalue,编译器会创建一个静态对象,内存只分配一次。
  • 如果有用到upvalue,那么每次传递这个委托都会产生内存分配。
2. 返回IEnumerator、IEnumerable的函数调用:32B
  • 每次调用都会分配内存,与使用方式无关[foreach,while(itor.MoveNext()) 都有分配]
  • 猜测分配原因:调用后会返回一个用于迭代的对象,这个对象占用了内存

注意事项

1. 不要对GetEnumerator使用using

  对于一个Dictionary类型,使用下面的方式遍历可以避免foreach产生的额外内存分配:

var itor = dict.GetEnumerator();
while (itor.MoveNext()) ;

  但是这么写VS会给一个波浪线提示:Instance of IEnumerator is never disposed,使用using包起来后就没有提示了。但是using包Enumerator后会产生额外的堆内存,其原因和foreach相似。

using (var itor = dict.GetEnumerator())
{
    while (itor.MoveNext()) ;
}
Dictionary.Enumerator

  Enumerator本身是struct不会产生堆内存,但Dispose()方法是IDisposable的接口,在using的时候值类型->引用类型产生了装箱操作。

你可能感兴趣的:(简记一波GC优化的实验结论)