对c#拆装箱的性能分析(泛型)

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());

经过多次运行,取平均值,大约为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());
经过多次运行得到一个平均值约为0.583,

可以轻松看出,应用泛型和没有应用泛型时间差了近6.7倍。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenyuling/articles/1609660.aspx

 

转载于:https://www.cnblogs.com/ly312/archive/2009/06/25/1511164.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNIX环境高级编程---进程间通信总结

进程间通信1 管道匿名管道命名管道2 消息队列3 信号量POSIX信号量有名信号量无名信号量有名信号量和无名信号量的公共操作4 共享内存5 信号相关函数6 套接字针对 TCP 协议通信的 socket 编程模型针对 UDP 协议通信的 socket 编程模型针对本地进程间通信的 socket 编程模型总结L…

C语言一个小小的问题引起的对指针的探究。。。

C语言一个小小的问题引起的对指针的探究。。。 废话不多说。下面是这个大家认识的一个及其简单的程序&#xff1a; 1 #include <stdio.h>2 void A(int a[])3 {4 printf("%d/t", sizeof(a));5 }6 int main()7 {8 int a[512];9 int *p; 10 …

java 方法 示例_Java集合syncedSet()方法与示例

java 方法 示例集合类syncedSet()方法 (Collections Class synchronizedSet() method) synchronizedSet() method is available in java.util package. 可以在java.util包中使用syncedSet ()方法 。 synchronizedSet() method is used to return the synchronized view of the …

IE的全屏幕显示(javascript)

<SCRIPT LANGUAGE"javascript"> <!-- if (this.name!fullscreen){ window.open(location.href,fullscreen,fullscreen,scrollbars) } // --> </script> 转载于:https://www.cnblogs.com/bangchao/archive/2009/06/26/1511645.html

搜索---广度优先遍历、深度优先遍历、回溯法

参考文章&#xff1a;https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%90%9C%E7%B4%A2.md 广度优先搜索&#xff08;BFS&#xff09; 广度优先搜索是按层来处理顶点的&#xff0c;距离开始点最近的那些顶点首先被访问&#…

如何更改Visual Studio 2008中类文件引用的默认名称空间?

在编写程序的时候&#xff0c;如果某些名称空间经常用到&#xff0c;每次创建一个文件的时候&#xff0c;都需要手工添加名称空间&#xff0c;是不是很烦人呢&#xff1f;多说人会回答&#xff1a;是的。如果新建文件的时候就自动加上自己需要的名称空间该多好啊。&#xff1a;…

Java ClassLoader findLoadedClass()方法与示例

ClassLoader类findLoadedClass()方法 (ClassLoader Class findLoadedClass() method) findLoadedClass() method is available in java.lang package. findLoadedClass()方法在java.lang包中可用。 findLoadedClass() method is used to return the Class with the given binar…

Linux内核设计与实现---内存管理

内存管理1 页2 区3 获得页获得填充为0的页释放页4 kmalloc()gfp_mask标志kfree()5 vmalloc()6 slab层slab层的设计7 slab分配器的接口8 在栈上的静态分配9 高端内核的映射永久映射临时映射10 每个CPU的分配11 新的每个CPU的接口编译时的每个CPU数据运行时每个CPU数据12 使用每个…

多语言开发 之 通过基页类及Session 动态响应用户对语言的选择

在用户通过UserLogin.aspx登录系统时 提供其对语言的选择选择后 将所选存入Session 以便登录系统后的其他页面进行按语言显示当然相关页面需要支持多语言具体信息可参看使用 根据语言环境不同 而显示不同的 资源本地化 ASP.NET 网页 App_Code下定义基页类 BasePage.cs Codeusin…

Java ClassLoader findSystemClass()方法与示例

ClassLoader类findSystemClass()方法 (ClassLoader Class findSystemClass() method) findSystemClass() method is available in java.lang package. findSystemClass()方法在java.lang包中可用。 findSystemClass() method is used to find the class with the given binary …

TFS 链接不上

C:\Users\Administrator>net use 会记录新的网络连接。 列表是空的。 C:\Users\Administrator>net use \\192.168.1.61\ipc$ wangkun /user:wangkun 命令成功完成。 转载于:https://www.cnblogs.com/rhythmK/archive/2012/06/04/2534066.html

Linux内核设计与实现---虚拟文件系统

虚拟文件系统1 通用文件系统2 文件系统抽象层3 Unix文件系统4 VFS对象及其数据结构其他VFS对象5 超级快对象超级块操作6 索引节点对象索引节点操作7 目录项对象目录项状态目录项缓存目录项操作8 文件对象9 和文件系统相关的数据结构10 和进程相关的数据结构11 Linux中的文件系统…

Oracle 查询历史数据(转帖)

回复误删除数据信息。 1、执行 alter table table_name enable row movement; 2、执行 FlashBack table table_name to timestamp to_timestamp(2012-05-24 14:59:36,yyyy-mm-dd hh24:mi:ss); 查询历史操作数据信息。 比较合理的方法是先从闪回区查找出被误删的数据&#xff0c…

Java里面的几种路径的区别

1&#xff0c;相对路径 相对路径就是指由这个文件所在的路径引起的跟其它文件&#xff08;或文件夹&#xff09;的路径关系。 也就是说&#xff1a; 对于如图所示&#xff1a;一news.html为例 在WEB15工程下的WebContent下的WEB-INF下的news.html 当我访问的news.html的时候…

Linux内核设计与实现---块I/O层

块I/O层1 解刨一个块设备2 缓冲区和缓冲区头3 bio结构体新老方法对比4 请求队列5 I/O调度程序I/O调度程序的工作Linus电梯最终期限I/O调度程序预测I/O调度程序完全公正的排队I/O调度程序空操作的I/O调度程序I/O调度程序的选择系统中能够 随机访问 固定大小数据片的设备被称为块…

Java字符类isUpperCase()方法与示例

角色类isUpperCase()方法 (Character class isUpperCase() method) isUpperCase() method is available in java.lang package. isUpperCase()方法在java.lang包中可用。 isUpperCase() method is used to check whether the given char value is uppercase or not. isUpperCas…

javascript:history.go()和History.back()的区别

javascript:history.go()和History.back()的区别收藏 <input typebutton value刷新 οnclick"window.location.reload()"> <input typebutton value前进 οnclick"window.history.go(1)"> <input typebutton value后…

sql查询行转列

--SQL 面试题 /* 问题&#xff1a;假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果)&#xff1a; 姓名 语文 数学 物理 ---- ---- ---- ---- 李四 74 84 94 张三 74 83 93 --…

算法---数

数1 最大公约数2 最小公约数3 进制转换4 阶乘统计阶乘尾部0的个数5 字符串加法减法二进制加法6 多数投票问题数组中出现次数多于n/2的元素7 相遇问题改变数组元素使所有元素都相同1 最大公约数 欧几里得算法&#xff1a;两个整数的最大公约数等于其中较小的那个数和两数相除余…

Java ByteArrayOutputStream reset()方法及示例

ByteArrayOutputStream类reset()方法 (ByteArrayOutputStream Class reset() method) reset() method is available in java.io package. reset()方法在java.io包中可用。 reset() method is used to reset this stream (i.e. it removes all currently consumed output in thi…