对c#拆装箱的性能分析(泛型)
来源:互联网 发布:淘宝客鹊桥如何使用 编辑:程序博客网 时间:2024/05/19 22:03
c#中,数据类型主要分为2种,分别为值类型和引用类型。把值类型转换为引用类型称为装箱,把引用类型转换为值类型称为拆箱。在c#中,值类型是在堆栈上分配内存的,而引用类型是在堆上分配内存的。装箱的时候,CLR会为堆上的对象创建一个临时的引用类型“box”。
该转换是隐式进行的,如上面的例子所述。还可以手工进行转换:
int i = 1;
object o = i;
而拆箱是显示的,
int i = 20;
bject o = i;
int j = (int)o;
在c#2.0之前的版本中,考虑如下问题,ArrayList集合的Add方法接受的是bject类型,如果此时进入的是值类型,那么就会进行装箱操作,如果从集合中取出数据,则还会进行相应的拆箱操作,现在观察,如果在一个大的循环结构中,进行这种操作,毋庸置疑的,会对性能造成影响,因为拆装箱本身就是要损失性能的。下面就分别使用泛型和不使用的情况进行代码分析。事例很简单,真实地业务环境会比这个复杂很多,再次仅仅表现出性能即可。
例子中声明一个arraylist集合,首先是将1千万个数字添加到集合中,然后再取出来,分别进行了装箱和拆箱操作,
DateTime tbegin = DateTime.Now;
ArrayList list = new ArrayList();
for (int i = 1; i <= 10000000; i++)
...{
//System.Threading.Thread.Sleep(1);
list.Add(i);
}
for (int j = 0; j < list.Count; j++)
...{
int s = (int)list[j];
}
DateTime tend = DateTime.Now;
TimeSpan ts = tbegin - tend;
Console.WriteLine(ts.ToString());
ArrayList list = new ArrayList();
for (int i = 1; i <= 10000000; i++)
...{
//System.Threading.Thread.Sleep(1);
list.Add(i);
}
for (int j = 0; j < list.Count; j++)
...{
int s = (int)list[j];
}
DateTime tend = DateTime.Now;
TimeSpan ts = tbegin - tend;
Console.WriteLine(ts.ToString());
经过多次运行,取平均值,大约为3.9秒,下面的代码适用泛型技术,应用了System.Collections.Generic命名空间下的泛型集合List<>,代码如下:
DateTime tbegin = DateTime.Now;
List<int> list = new List<int>();
// ArrayList list = new ArrayList();
for (int i = 1; i <= 10000000; i++)
...{
//System.Threading.Thread.Sleep(1);
list.Add(i);
}
for (int j = 0; j < list.Count; j++)
...{
int s = (int)list[j];
}
DateTime tend = DateTime.Now;
TimeSpan ts = tbegin - tend;
Console.WriteLine(ts.ToString());
List<int> list = new List<int>();
// ArrayList list = new ArrayList();
for (int i = 1; i <= 10000000; i++)
...{
//System.Threading.Thread.Sleep(1);
list.Add(i);
}
for (int j = 0; j < list.Count; j++)
...{
int s = (int)list[j];
}
DateTime tend = DateTime.Now;
TimeSpan ts = tbegin - tend;
Console.WriteLine(ts.ToString());
经过多次运行得到一个平均值约为0.583,
可以轻松看出,应用泛型和没有应用泛型时间差了近6.7倍。
- 对c#拆装箱的性能分析(泛型)
- 对c#拆装箱的性能分析(泛型)
- 开发中不经意的自动拆装箱影响性能问题
- JDK1.5的拆装箱
- java的自动拆装箱
- java技术(拆装箱)int和integer的区别
- 拆装箱
- 拆装箱
- Integer的自动拆装箱的陷阱
- Integer的自动拆装箱的陷阱
- Integer的缓存和自动拆装箱
- 基本数据的自动拆装箱
- Integer的自动拆装箱问题
- 使用gprof对程序的性能分析(集合贴)
- C#装箱和拆箱(装箱和拆箱对应用程序性能的影响)
- Ajax 对Web性能的影响分析
- 对linux系统运行性能的分析
- AdrenoProfiler对opengles的性能分析
- 搜索引擎技术发展简析
- 计算结构/类中的数据成员的偏移
- JSP中的隐含对象
- CMMI 工作笔记
- 高质量软件开发人员的五大习惯
- 对c#拆装箱的性能分析(泛型)
- 捕捉DataGrid的双击事件(C#版本)
- TreeView使用笔记
- Sun拓展J2ME开发平台
- 买现房,十二妙招
- 细读《Effective C++》之九
- 全面接触SQL语法(2)
- 搬家啦,把在donews多年的存货搬到csdn来
- IT 系統测试报告编写指南