黑马程序员技术交流社区
标题:
拆箱装箱会损耗性能,但是实际项目中又不可避免。
[打印本页]
作者:
彭康
时间:
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