原文是在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#中几种常见数组复制方法的效率对比的更多相关文章

  1. OpenCL中三种内存创建image的效率对比

    第一种:使用ION: cl_mem_ion_host_ptr ion_host_ptr1; ion_host_ptr1.ext_host_ptr.allocation_type = CL_MEM_IO ...

  2. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  3. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  4. Spring RestTemplate中几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  5. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  6. 比较C#中几种常见的复制字节数组方法的效率

    在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffe ...

  7. 比较C#中几种常见的复制字节数组方法的效率[转]

    [原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...

  8. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  9. Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

随机推荐

  1. 邓_mysql_面试

    问题1:你如何确定 MySQL 是否处于运行状态? 答案: Debian 上运行命令service mysql status,在RedHat 上运行命令service mysqld status.然后 ...

  2. Node.js进阶:5分钟入门非对称加密方法

    前言 刚回答了SegmentFault上一个兄弟提的问题<非对称解密出错>.这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下. 非对称加密的理 ...

  3. Codeforces 900 E. Maximum Questions (DP,技巧)

    题目链接:900 E. Maximum Questions 题意: 给出一个长度为n只含有a和b还有'?'的串s,且'?'可以被任意替换为a或b.再给出一个字符串t (奇数位上为a,偶数位上为b,所以 ...

  4. MySQL 取得小时分钟部分

    MySQL 取得小时分钟部分 SELECT `CpParkID` , DATE_FORMAT( `UPDATE_TIME` , '%H:%i' )FROM `cp_park`WHERE HOUR( ` ...

  5. 洛谷 P1078 文化之旅

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...

  6. Oracle积累

    Oracle积累 1           用To_char()转换带小数的数值. 例如:0.125 取两位小数. To_char(0.125,'FM990.99')   -> 0.13 注: 格 ...

  7. Mysql覆盖索引 covering index 或者 index coverage

    组合索引 提到组合索引,大家都知道"最左前缀"原则.例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age ...

  8. 解决页面引用百度地图API设置点的logo不显示问题

    在写css时需要引用一个百度的api地图,却发现设置点的logo图片不能显示,后查阅百度测试发现是图片路径的问题: 在引用的下载的html页面找到 var icon = new BMap.Icon 将 ...

  9. linux_vi快捷键

    vi有哪些快捷方式? 到行头: 0 ^ home 到行尾: $ shif+a(编辑模式) end 退出保存: wq . x .wq!(强制退出保存) 强制退出不保存: q! 光标移到文件最后一行: s ...

  10. 重温MFC

    1. Button控件 2. 旋转和高级编辑控件 3. 标签控件和属性页 4. 列表控件 5. 树控件 6. 进度条控件和滑动条控件 7. 滚动条 8.工具栏和状态栏