装箱与拆箱及其性能损失问题
首先我想了解一下什么是装箱和拆箱
在类型系统中,任何值类型和引用类型都可以和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 阅读(1216) 评论(1) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架