资源描述
1 2 3 Un it y 之 C# 效率篇 腾讯互娱高级工程师 - 陶涛 一、 简介 效率包括了代码的 GC 大小与内存大小,执行速度等等。其中执行速度不是关注的重点。 Mo no 项目主页: h tt p:/ /ww w.mo n o - pr o j e ct / I L SPY 反编译工具,功能比 N ET .R e fl e ct o r 好用多了。 具体的使用方法可以百度。 简单的过程: 把编译的 dl l( L i bra ry Scri ptA ss e m bl i e s 目录下的 A ss e m bl y - CS h ar p.dl l )拖入左边窗口,选择需要查看的类以及函数,然后选择翻译的语言,具 体如下 环境 4 IL 代码 举个简单的例子,来说明 IL 代码把,具体可查阅 m sdn 文档。 C# 代码: object objValue = 4; int value = ( int )objValue; 生成的 IL 代码如下:(注释有详细的说明) 二、 GC 与内存篇 f o r 与 f o r eac h 真相 目的 在 Mo n o 下,研究两种不同方式的 GC 情况。 环境 同简介中的环境 测试代码 using UnityEngine; using System.Collections; using Sy stem.Collections.Generic; public class TestCodPerfomanceScript : MonoBehaviour / Use this for initialization List mData = new List(); void Start () mData.Add(1); / 可有 n 个元素, n 也可以为 0 void testForForeach_foreach() foreach (var e in mData) /Debug.Log(e); 5 void testForForeach_for() int len = mData.Count; for ( int i = 0; i C # 代码 从代码中,我们可知 fo reac h 中,编译器加了不少代码。从这里应该是有发生过装箱的操作。从对 test Fo rF o reac h _n o n f o reac h 函数的反编译 C# 代码来看,应该是 u sin g 那块产生装箱操作。继续查看反编译的 IL 代码。 反编译 - I L 代码 test Fo rF o reac h _f o rea ch 的 IL 代码 从图中可以清楚中的看到有一次装箱过程。 7 数据结论 可以显然 可知, fo reac h 每次有 40B 的 GC 产生(这个是 Mo n o 的一个 bu g )。其余两种方式不产生 GC 。 产生 GC 的根本原因是使用了 us ing 语句。( G e tEnu m e ra tor( ) 返回值类型,在u sin g 中装箱了) 那么,我们写一段测试代码,在去验证一下: void testForForeach_nonforeachUsing() using (var e = mData.GetEnumerator() while (e.MoveNext() 得到的数据是 意义 所以,在目前的项目中, fo reac h 还是有 GC 的。(不管是 I L i st 还是 A rr ayL i st都会有 GC ) 具体见测试数据 建议项目中采用 test Fo rF o reac h _f o r( ) 和 test F o rF o reac h _n o n f o reac h ( ) 的写法。尤其是在 u pdat e 或 L at e U pdat e 中。 在处理 Dictio n ar y 遍历的时候,我们可以这样: var enumerator = m _Dictionary.GetEnumerator(); while (enume rator.MoveNext() var element = enumerator.Current; element.Value.UpdateComponent(deltaTime);
展开阅读全文