在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffer.BlockCopy,以及System.Buffer.memcpyimpl,由于最后一种需要使用指针,所以本文不引入该方法。

本次测试,使用以上前4种方法,各运行1000万次,观察结果。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. namespace BenchmarkCopyArray
  6. {
  7. class Program
  8. {
  9. private const int TestTimes = 10000000;
  10. static void Main()
  11. {
  12. var testArrayCopy = new TestArrayCopy();
  13. TestCopy(testArrayCopy.TestBinaryReader, "Binary.ReadBytes");
  14. TestCopy(testArrayCopy.TestConvertToList, "ConvertToList");
  15. TestCopy(testArrayCopy.TestArrayDotCopy, "Array.Copy");
  16. TestCopy(testArrayCopy.TestBlockCopy, "Buffer.BlockCopy");
  17. Console.Read();
  18. }
  19. private static void TestCopy(Action testMethod, string methodName)
  20. {
  21. var stopWatch = new Stopwatch();
  22. stopWatch.Start();
  23. for (int i = 0; i < TestTimes; i++)
  24. {
  25. testMethod();
  26. }
  27. testMethod();
  28. stopWatch.Stop();
  29. Console.WriteLine("{0}: {1} seconds, {2}.", methodName, stopWatch.Elapsed.Seconds, stopWatch.Elapsed.Milliseconds);
  30. }
  31. }
  32. class TestArrayCopy
  33. {
  34. private readonly byte[] _sourceBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  35. public void TestBinaryReader()
  36. {
  37. var binaryReader = new BinaryReader(new MemoryStream(_sourceBytes));
  38. binaryReader.ReadBytes(_sourceBytes.Length);
  39. }
  40. public void TestConvertToList()
  41. {
  42. IList<byte> bytesSourceList = new List<byte>(_sourceBytes);
  43. var bytesNew = new byte[_sourceBytes.Length];
  44. bytesSourceList.CopyTo(bytesNew, 0);
  45. }
  46. public void TestArrayDotCopy()
  47. {
  48. var bytesNew = new byte[_sourceBytes.Length];
  49. Array.Copy(_sourceBytes, 0, bytesNew, 0, _sourceBytes.Length);
  50. }
  51. public void TestBlockCopy()
  52. {
  53. var bytesNew = new byte[_sourceBytes.Length];
  54. Buffer.BlockCopy(_sourceBytes, 0, bytesNew, 0, _sourceBytes.Length);
  55. }
  56. }
  57. }

运行结果如下:

希望以上测试对您会有所帮助。

转自:http://blog.csdn.net/jiangzhanchang/article/details/9998229

比较C#中几种常见的复制字节数组方法的效率的更多相关文章

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

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

  2. lua中,两种json和table互转方法的效率比较

    lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据 ...

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

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

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

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

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

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

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

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

  7. ADB几种常见的错误及解决方法

    下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...

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

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

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

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

随机推荐

  1. Ex0203

    游戏 –     这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的? 朋友们都在玩,我在试玩的时候也觉得很不错:游戏基本上的目标都 ...

  2. IO文件流

    定义:流是一种抽象的概念,通过流的方式组成无结构字符和字符序列,从流中取数据的操作进行输入输出.[io流的作用就是用流的方式进行输入输出] 常用语法: 1.   首先引用using.system.io ...

  3. POJ1037 A decorative fence

    题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...

  4. Linux下的常用文本编辑器

    Linux的文本编辑器 ed 在早期的unix平台上,ed可以说是唯一的编辑工具.它是一个很古老的行编辑器,vi这些编辑器都是从ed 演化而来.行编辑器使用起来很不方便,每次只能对一行进行操作,.而后 ...

  5. sql 用过记住

    1 递归查询一个节点下的所有子节点 包括该节点 connect by h.parent_menu_id= prior h.menu_idstart with h.menu_id='当前节点' h.pa ...

  6. 【转】对象克隆(C# 快速高效率复制对象另一种方式 表达式树)

    原文地址:https://www.cnblogs.com/lsgsanxiao/p/8205096.html 1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: p ...

  7. Cobbler全自动批量安装部署Linux系统

    说明: Cobbler服务器系统:CentOS 5.10 64位 IP地址:192.168.21.128 需要安装部署的Linux系统: eth0(第一块网卡,用于外网)IP地址段:192.168.2 ...

  8. JavaScript代码优化

    1.if else 语句中变量赋值为布尔值 if (a > b) { status = true; } else { status = false; } // 可以简化为 status = a ...

  9. Mysql中判断一个点是否落在多边形内

    关于地理空间数据,经常需要处理两个空间数据的关联关系.有很多种方法可以处理,通过编写程序算法,或者是调用数据库中对应的function.在mysql数据库中,https://dev.mysql.com ...

  10. 复制虚拟机vmware centos搭建集群节点过程中网络配置eth0和eth1遇到的问题以及NAT模式下虚拟机静态IP配置方法

    在centos中安装完第一个虚拟机后,一般习惯通过克隆的方式创建其它虚拟机,开后vmware无法发现网卡信息,系统认为这是重新安装,所以重新创建了一个新的网卡叫eth1. 并且用IFCONFIG-a查 ...