在C#中几种常见数组复制方法的效率对比
原文是在http://blog.csdn.net/jiangzhanchang/article/details/9998229 看到的,本文在原文基础上增加了新的方法,并对多种数据类型做了更全面的对比。
首先列出代码,以下是五种复制方式,我们首先来对字节数组进行测试。

第一种方法时用BinaryReader的方式读取byte。
第二种是用先存到List,然后再用IList接口的CopyTo方法复制。
第三种直接使用的是Array的Copy。
第四种使用的是Array的ConstrainedCopy。
第五种则是Buffer的BlockCopy方法。

输入测试代码,为了具有对比性,我们一共循环五千万次。
由于受计算机状态影响,我们一共测试了5次来抵消不利因素。





可以看到性能表现最好的是Buffer.BlockCopy,而Array的两个Copy方法也不遑多让。另外两个方法基本可以排除。
作为对比,我们用纯赋值的方式再测一下。




可以看到,性能非常接近最佳。
接下来我们修改代码,用Int32类型的数组进行复制。这里就无法使用Binary的方法了。
代码略。


可以看到,类型的改变对效率变化没有影响.
我们继续改变数组的类型为string(引用类型)。
运行上述程序,会发生错误:

经过判断,错误信息是由Buffer.BlockCopy发出的,也就是说,这个方法只支持基础类型。
我们去掉这个方法,继续执行。


和之前的差不多。
看到这里,孰胜孰败相信大家心里已经有了答案。
根据CLR via C#这本书所说的,设计BlockCopy的目的实际是将按位兼容的数据从一个数组类型复制到另一个按位兼容的数据类型,比如Byte[]可以复制到Char[]。但同时也限制了其只能使用基元类型的数组。
要将一个数组元素可靠地复制到另一个数组,应该使用ConstrainCopy这个方法。该方法要么完成复制,要么抛出异常,总之不会破坏目标数组中的数据。
当然自己写FOR循环赋值也未尝不可。
在C#中几种常见数组复制方法的效率对比的更多相关文章
- OpenCL中三种内存创建image的效率对比
第一种:使用ION: cl_mem_ion_host_ptr ion_host_ptr1; ion_host_ptr1.ext_host_ptr.allocation_type = CL_MEM_IO ...
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- 自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用 首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...
- Spring RestTemplate中几种常见的请求方式
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明 ...
- 比较C#中几种常见的复制字节数组方法的效率
在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffe ...
- 比较C#中几种常见的复制字节数组方法的效率[转]
[原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...
- JavaScript 中 4 种常见的内存泄露陷阱
了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...
- Java中9种常见的CMS GC问题分析与解决
1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...
随机推荐
- 将自己的代码托管到github上
这几天一直在做一个爬虫的小demo,代码基本写的差不多了,想着如何把他放在一个地方,如是乎注册了一个github账号,开始了自己的git之旅. 首先是下载git,这个我就不多说啦!到处都有推荐看看廖雪 ...
- 【开发技术】eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法
要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. 原来是和“简繁体快捷键”冲突了.输入法中的这个快捷键我们一般不用,小勾勾去掉就成了. eclipse ...
- J.U.C JMM. pipeline.指令重排序,happen-before
pipeline: 现在的CPU一般采用流水线方式来执行指令.一个指令执行周期被分成:取值,译码,执行,访存,写会,更新PC若干阶段.然后,多条指令可以同时存在于流水线中,同时被执行,来提高系统的吞吐 ...
- Excel的列编号 例如:A对应1,Z对应26,AA对应27,AZ对应52的JavaScript怎么写?
今天碰到的题目,当时不会.回来想了一会,调试了一下,然后想上网对答案,发现竟然没有!!! function str(num){ if(num<=0){ alert("excel表格貌似 ...
- Redis-安装、启动
安装Redis 下载redis安装包http://download.redis.io/redis-stable.tar.gz 解压安装包tar xzf redis-stable.tar.gz 安装cd ...
- duilib消息类型
//定义所有消息类型 ////////////////////////////////////////////////////////////////////////// #define DUI_MS ...
- Oracl Over函数
Oracl Over函数 简介 在介绍Over之前, 必须提到开窗函数, 与 聚 合函数一样, 开窗函数也是对行集组进行聚合计算, 但是它不像普通聚合函数那样每组只返回一个值, 开窗函数可以为每组返回 ...
- Android studio修改包名
最后一步,需要手动修改工程 build.gradle文件中的applicationId改为跟你的包名一致即可,
- 获取客户端登录ip地址
request方法客户端IP: request.getRemoteAddr() 输出:192.168.0.106 客户端主机名:request.getRemoteHost()输出:abc 在JSP里 ...
- java web response提供文件下载功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...