装箱与拆箱及其性能损失问题
首先我想了解一下什么是装箱和拆箱
在类型系统中,任何值类型和引用类型都可以和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
装箱与拆箱及其性能损失问题相关推荐
- 六个重要的.NET概念:栈、堆、值类型、引用类型、装箱和拆箱
目录 介绍 当你声明一个变量时,里面有什么? 栈和堆 值类型和引用类型 那么哪些数据类型是引用类型,哪些是值类型? 装箱和拆箱 装箱和拆箱的性能含义 关于源代码 下载源代码 - 42.5 KB 介绍 ...
- 对C#装箱和拆箱的理解
[什么是装箱和拆箱] 装箱(box)是将值类型转换为引用类型的过程,拆箱(unbox)是将引用类型转换为值类型的过程 [装箱过程] 先在堆上分配存储位置.(注解:引用类型的数据值放在堆中) 将值类型数 ...
- java 自动装箱自动拆箱,java自动装箱、自动拆箱和正常情况性能比较
自动装箱和自动拆箱是java5.0版本引入的,能自动将基本类型转换为对应的基本类型包装对象,那么我们比较一下他们的性能情况. package com.wmmad.test; import junit. ...
- 关于Visual C#装箱与拆箱的研究
关于Visual C#装箱与拆箱的研究 2004-09-15 作者: 出处: CSDN 在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题. 观者也许曾无数次的使 ...
- 浅谈.NET中的类型和装箱、拆箱原理
谈到装箱拆箱,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么建议你花点时间看看楼主这篇文章 1. .NET中的类型 为了 ...
- 浅C#中的装箱和拆箱
1.什么是装箱和拆箱? 简单的来说: 装箱就是值类型转换为引用类型:拆箱就是引用类型转换为值类型 值类型,包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulo ...
- [Java开发之路](23)装箱与拆箱
1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...
- [CLR via C#]5.3 值类型的装箱和拆箱
原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...
- C# 装箱和拆箱[整理]
1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链 ...
最新文章
- conda-forge,conda,-c的理解
- clion register
- Angular单元测试的spyOn使用一例
- java 注解应用技巧_改善Java应用程序性能的快速技巧
- Metal日记:使用步骤指南
- memcached php 测试,php一致性hash性能测试(flexihash/memcache/memcached)
- mysql 矩表_mysql表某相同值最近一次出现的间距
- 湖南职称计算机英语,湖南职称计算机考试哪里考,A,B,C,D各级别是怎么划分的...
- 二、信号分解 —>经验模态分解(EMD)学习笔记
- 如何导入ybc_speech语音包,来和电脑聊天吧
- 【Linux】常用配置文件路径
- 算法练习, 红白花放置方法数
- 图灵、冯诺依曼谁更牛?
- 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染
- 内存优化 · 基础论 · 初识 Android 内存优化
- 五、RISC-V SoC内核——中断 代码讲解
- 一款运行在Mac平台上的浏览器:Vivaldi浏览器 for Mac
- 基于Xgboost的不均衡数据分类
- GitHub的raw.githubusercontent.com无法链接
- cubemx 配置sd卡 读写测试程序
热门文章
- java中file类_Java中file类
- python中strip函数_让你整明白python strip函数妙用
- bool转nsnumber ios_iOS 的 NSNumber(对基本数据类型) NSValue(对结构体) 的装箱
- java双等比较值_java – 执行双值相等比较时,应该是epsilon值
- 模板方法(设计一个稳定的父类框架,框架中的有一些步骤是可变的,将可变的步骤子类中来实现)
- CUDA学习-函数前缀__global__
- HALCON查找圆心
- 彩色MT9V034摄像头 Bayer转rgb FPGA实现(转载)
- mysql json 函数_MYSQL 开发设计表是硬邦邦的VARHCAR 还是JSON TYPE 来处理数据更香
- floyd算法_最短路径的算法:Floyd算法