黑马程序员技术交流社区

标题: 拆箱装箱会损耗性能,但是实际项目中又不可避免。 [打印本页]

作者: 彭康    时间: 2013-6-12 11:43
标题: 拆箱装箱会损耗性能,但是实际项目中又不可避免。
本帖最后由 彭康 于 2013-6-13 21:12 编辑

大家有没有比较万金油的办法,又或者好的架构是怎么解决这个问题的
作者: pongo73    时间: 2013-6-12 12:43
也许泛型能解决,前些日子看来下,不大懂{:soso_e113:}
作者: 无__畏    时间: 2013-6-13 00:35
使用强类型和泛型T  ?
作者: 彭康    时间: 2013-6-13 09:12
无__畏 发表于 2013-6-13 00:35
使用强类型和泛型T  ?

泛型确实能减少一部分拆箱装箱的使用 不过C#编辑的时候很多意想不到的地方 也出现装箱拆箱了
作者: fcyan86    时间: 2013-6-13 12:07
有一个强大的CPU,{:soso_e113:}不惧低效
作者: popoluno    时间: 2013-6-13 14:24
不可避免会拆箱装箱,但是我们尽量使用泛型来减少
作者: 李建龙    时间: 2013-6-13 21:01
拆箱是将引用类型转换为值类型 ;反之,装箱!  利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来 ;   [csharp] 例如: int val = 100;           object obj = val;              Console.WriteLine (“对象的值 = ",obj);    例如: int val = 100;      object obj = val;            Console.WriteLine (“对象的值 = ",obj); 这是一个装箱的过程,是将值类型转换为引用类型的过程   [csharp]   int val = 100;  object obj = val;   int num = (int) obj;   Console.WriteLine ("num: ",num);<SPAN style="LINE-HEIGHT: 24px; FONT-FAMILY: arial, 宋体, sans-serif; FONT-SIZE: 14px"> </SPAN>       int val = 100;  object obj = val;  int num = (int) obj;  Console.WriteLine ("num: ",num); 这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程  显然,从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。看下面代码  [csharp] class Program     {         static void Main(string[] args)         {             //// 用时:00:00:01.6070325(跟电脑运行效率有一定关系)              //ArrayList list = new ArrayList();              //Stopwatch watch = new Stopwatch();              //watch.Start();              //for (int i = 0; i < 10000000; i++)              //{              ////使用ArrayList集合,每次增加一个数字都会发生装箱操作。              //    list.Add(i);              //}              //watch.Stop();              //Console.WriteLine(watch.Elapsed);              //Console.ReadKey();/                  //用时:00:00:00.1402388,使用泛型集合后,省去了装箱与拆箱操作,性能大大提升。              List<int> list = new List<int>();             Stopwatch watch = new Stopwatch();             watch.Start();             for (int i = 0; i < 10000000; i++)             {                 list.Add(i);             }             watch.Stop();             Console.WriteLine(watch.Elapsed);             Console.ReadKey();         }     }    class Program     {         static void Main(string[] args)         {             //// 用时:00:00:01.6070325(跟电脑运行效率有一定关系)             //ArrayList list = new ArrayList();             //Stopwatch watch = new Stopwatch();             //watch.Start();             //for (int i = 0; i < 10000000; i++)             //{             ////使用ArrayList集合,每次增加一个数字都会发生装箱操作。             //    list.Add(i);             //}             //watch.Stop();             //Console.WriteLine(watch.Elapsed);             //Console.ReadKey();//使用泛型集合后,省去了装箱与拆箱操作,性能大大提升。             List<int> list = new List<int>();             Stopwatch watch = new Stopwatch();             watch.Start();             for (int i = 0; i < 10000000; i++)             {                 list.Add(i);             }             watch.Stop();             Console.WriteLine(watch.Elapsed);             Console.ReadKey();         }     } 总结:              1.装箱、拆箱必须是:值类型→引用类型  或  引用类型→值类型。              object,接口。值类型是可以实现接口。              Personp=new Student();//这个叫隐式类型转换,不叫装箱。              Studentstu=(Student)p;//这个叫显示类型转换,不叫拆箱。              int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型,              因为object类型时int类型的父类。              2.拆箱时,必须用装箱时的类型来拆箱              装箱时如果是int,拆箱必须用int,不能用double       3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。    4.字符串连接       string s1 = "a";       string s2 = "b";       int n3 = 10;       double d4 = 99.9;       string result = string.Concat(s1, s2, n3, d4);          string s1 = "a";             string s2 = "b";             int n3 = 10;             double d4 = 99.9;             string result = string.Concat(s1, s2, n3, d4);      //string.Concat(s1,s2, n3, d4); 判断是否发生了装箱,及次数。                   //string.Concat(s1,s2, n3, d4); 判断是否发生了装箱,及次数。   
作者: 李建龙    时间: 2013-6-13 21:03
拆箱是将引用类型转换为值类型 ;反之,装箱!

利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来 ;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2