记录点滴收获,汇聚知识乐园

脚步无法到达的地方,目光可以到达;目光无法到达的地方,梦想可以到达

导航

装箱与拆箱及其性能损失问题

首先我想了解一下什么是装箱和拆箱

在类型系统中,任何值类型和引用类型都可以和object类型进行转化,装箱转化是指将一个值类型显式或者隐式的转化为一个object类型,或者是转化成一个被该值类型应用的接口类型,将一个值类型装箱,就创建了一个object实例,并且将这个值赋值给了object,object对象的数据位于堆中,在栈上有对该对象的引用,而被装箱的类型的值是被作为一个复制的文件赋给对象的,所谓拆箱,就是装箱操作的反操作,复制堆中的对象至栈中,并且返回其值。

性能损失:

相比于简单的赋值操作,装箱和拆箱需要进行大量的计算,对值类型进行装箱时,需要分配并构造一个全新的对象。

为了解决装箱与拆箱带来的性能损失问题,微软公司在.NET中提供了泛型。

下面就让我们看一段代码:

将5000000条记录写入到ArrayList并将数据读出来5遍,其中写入和读取ArrayList的工作就是装箱和拆箱,最后计算出执行这些方法所消耗的时间。

 class Unbox

    {

        public static void RunUnbox()

        {

            int count;

            DateTime startTime = DateTime.Now;

            ArrayList MyArrayList = new ArrayList();

            for (int i = 0; i < 5; i++)

            {

                MyArrayList.Clear();

                for (count = 0; count < 5000000; count++)

                {

                    MyArrayList.Add(count); //装箱

                }

                int j;

                for (count = 0; count < 5000000; count++)

                {

                    j = (int)MyArrayList[count];//拆箱

                }

            }

            DateTime endTime = DateTime.Now;

            Console.WriteLine("使用装箱和拆箱共花时间:{0}",endTime-startTime);

        }

        public static void RunNoBox()

        {

            int count;

            DateTime startTime = DateTime.Now;

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

            for (int i = 0; i < 5; i++)

            {

                MyTList.Clear();

                for (count = 0; count < 5000000; count++)

                {

                    MyTList.Add(count); 

                }

                int j;

                for (count = 0; count < 5000000; count++)

                {

                    j = MyTList[count];

                }

            }

            DateTime endTime = DateTime.Now;

            Console.WriteLine("使用泛型共花时间:{0}", endTime - startTime);       

        } 

    }

    class Test

    {

        static void Main(string[] args)

        {

            Unbox.RunUnbox();

            Unbox.RunNoBox();

            Console.ReadLine();

        }

    }

下面是运行结果:

使用装箱和拆箱共花时间:00:00:04.2500000

使用泛型共花时间:00:00:00.4687500

由运行结果可以发现,即使是进行同样的操作,使用装箱和拆箱所使用的时间是使用泛型所花时间的10倍。

posted on 2011-10-16 01:05  guowenhui  阅读(1207)  评论(1编辑  收藏  举报