天天看点

对c#拆装箱的性能分析(泛型)

  c#中,数据类型主要分为2种,分别为值类型和引用类型。把值类型转换为引用类型称为 装箱,把引用类型转换为值类型称为拆箱。在 c#中,值类型是在堆栈上分配内存的,而引用类型是在堆上分配内存的。 装箱的时候,CLR会为堆上的对象创建一个临时的引用类型“box”。 该转换是隐式进行的,如上面的例子所述。还可以手工进行转换: int i = 1; object o = i; 而拆箱是显示的, int i = 20;   bject o = i; i nt j = (int)o;             在c#2.0之前的版本中,考虑如下问题,ArrayList集合的Add方法接受的是bject类型,如果此时进入的是值类型,那么就会进行装箱操作,如果从集合中取出数据,则还会进行相应的拆箱操作,现在观察,如果在一个大的循环结构中,进行这种操作,毋庸置疑的,会对性能造成影响,因为拆装箱本身就是要损失性能的。下面就分别使用泛型和不使用的情况进行代码分析。事例很简单,真实地业务环境会比这个复杂很多,再次仅仅表现出性能即可。 例子中声明一个arraylist集合,首先是将1千万个数字添加到集合中,然后再取出来,分别进行了装箱和拆箱操作,

对c#拆装箱的性能分析(泛型)

DateTime tbegin  =  DateTime.Now;

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

            ArrayList list  =   new  ArrayList();

对c#拆装箱的性能分析(泛型)

             for  ( int  i  =   1 ; i  <=   10000000 ; i ++ )

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

             ... {

对c#拆装箱的性能分析(泛型)

                //System.Threading.Thread.Sleep(1);

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

                list.Add(i);

对c#拆装箱的性能分析(泛型)

            }

对c#拆装箱的性能分析(泛型)

             for  ( int  j  =   0 ; j  <  list.Count; j ++ )

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

             ... {

对c#拆装箱的性能分析(泛型)

                int s = (int)list[j];

对c#拆装箱的性能分析(泛型)

            }

对c#拆装箱的性能分析(泛型)

            DateTime tend  =  DateTime.Now;

对c#拆装箱的性能分析(泛型)

            TimeSpan ts  =  tbegin  -  tend;

对c#拆装箱的性能分析(泛型)

            Console.WriteLine(ts.ToString());

对c#拆装箱的性能分析(泛型)

经过多次运行,取平均值,大约为3.9秒,下面的代码适用泛型技术,应用了System.Collections.Generic命名空间下的泛型集合List<>,代码如下:

对c#拆装箱的性能分析(泛型)

DateTime tbegin  =  DateTime.Now;

对c#拆装箱的性能分析(泛型)

            List < int >  list  =   new  List < int > ();

对c#拆装箱的性能分析(泛型)

             //  ArrayList list = new ArrayList();

对c#拆装箱的性能分析(泛型)

             for  ( int  i  =   1 ; i  <=   10000000 ; i ++ )

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

             ... {

对c#拆装箱的性能分析(泛型)

                //System.Threading.Thread.Sleep(1);

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

                list.Add(i);

对c#拆装箱的性能分析(泛型)

            }

对c#拆装箱的性能分析(泛型)

             for  ( int  j  =   0 ; j  <  list.Count; j ++ )

对c#拆装箱的性能分析(泛型)
对c#拆装箱的性能分析(泛型)

             ... {

对c#拆装箱的性能分析(泛型)

                int s = (int)list[j];

对c#拆装箱的性能分析(泛型)

            }

对c#拆装箱的性能分析(泛型)

            DateTime tend  =  DateTime.Now;

对c#拆装箱的性能分析(泛型)

            TimeSpan ts  =  tbegin  -  tend;

对c#拆装箱的性能分析(泛型)

            Console.WriteLine(ts.ToString());

经过多次运行得到一个平均值约为0.583,

可以轻松看出,应用泛型和没有应用泛型时间差了近6.7倍。