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

在类型系统中,任何值类型和引用类型都可以和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倍。

转载于:https://www.cnblogs.com/SoarGavin/archive/2013/05/07/3064710.html

装箱与拆箱及其性能损失问题相关推荐

  1. 六个重要的.NET概念:栈、堆、值类型、引用类型、装箱和拆箱

    目录 介绍 当你声明一个变量时,里面有什么? 栈和堆 值类型和引用类型 那么哪些数据类型是引用类型,哪些是值类型? 装箱和拆箱 装箱和拆箱的性能含义 关于源代码 下载源代码 - 42.5 KB 介绍 ...

  2. 对C#装箱和拆箱的理解

    [什么是装箱和拆箱] 装箱(box)是将值类型转换为引用类型的过程,拆箱(unbox)是将引用类型转换为值类型的过程 [装箱过程] 先在堆上分配存储位置.(注解:引用类型的数据值放在堆中) 将值类型数 ...

  3. java 自动装箱自动拆箱,java自动装箱、自动拆箱和正常情况性能比较

    自动装箱和自动拆箱是java5.0版本引入的,能自动将基本类型转换为对应的基本类型包装对象,那么我们比较一下他们的性能情况. package com.wmmad.test; import junit. ...

  4. 关于Visual C#装箱与拆箱的研究

    关于Visual C#装箱与拆箱的研究 2004-09-15  作者: 出处: CSDN 在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题. 观者也许曾无数次的使 ...

  5. 浅谈.NET中的类型和装箱、拆箱原理

    谈到装箱拆箱,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么建议你花点时间看看楼主这篇文章 1. .NET中的类型 为了 ...

  6. 浅C#中的装箱和拆箱

    1.什么是装箱和拆箱? 简单的来说: 装箱就是值类型转换为引用类型:拆箱就是引用类型转换为值类型 值类型,包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulo ...

  7. [Java开发之路](23)装箱与拆箱

    1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...

  8. [CLR via C#]5.3 值类型的装箱和拆箱

    原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...

  9. C# 装箱和拆箱[整理]

    1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链 ...

最新文章

  1. conda-forge,conda,-c的理解
  2. clion register
  3. Angular单元测试的spyOn使用一例
  4. java 注解应用技巧_改善Java应用程序性能的快速技巧
  5. Metal日记:使用步骤指南
  6. memcached php 测试,php一致性hash性能测试(flexihash/memcache/memcached)
  7. mysql 矩表_mysql表某相同值最近一次出现的间距
  8. 湖南职称计算机英语,湖南职称计算机考试哪里考,A,B,C,D各级别是怎么划分的...
  9. 二、信号分解 —>经验模态分解(EMD)学习笔记
  10. 如何导入ybc_speech语音包,来和电脑聊天吧
  11. 【Linux】常用配置文件路径
  12. 算法练习, 红白花放置方法数
  13. 图灵、冯诺依曼谁更牛?
  14. 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染
  15. 内存优化 · 基础论 · 初识 Android 内存优化
  16. 五、RISC-V SoC内核——中断 代码讲解
  17. 一款运行在Mac平台上的浏览器:Vivaldi浏览器 for Mac
  18. 基于Xgboost的不均衡数据分类
  19. GitHub的raw.githubusercontent.com无法链接
  20. cubemx 配置sd卡 读写测试程序

热门文章

  1. java中file类_Java中file类
  2. python中strip函数_让你整明白python strip函数妙用
  3. bool转nsnumber ios_iOS 的 NSNumber(对基本数据类型) NSValue(对结构体) 的装箱
  4. java双等比较值_java – 执行双值相等比较时,应该是epsilon值
  5. 模板方法(设计一个稳定的父类框架,框架中的有一些步骤是可变的,将可变的步骤子类中来实现)
  6. CUDA学习-函数前缀__global__
  7. HALCON查找圆心
  8. 彩色MT9V034摄像头 Bayer转rgb FPGA实现(转载)
  9. mysql json 函数_MYSQL 开发设计表是硬邦邦的VARHCAR 还是JSON TYPE 来处理数据更香
  10. floyd算法_最短路径的算法:Floyd算法