C#复制数组的两种方式,以及效率比较

如何高效地进行数组复制?

如果把一个变量值复制给另外一个数组变量,那么2个变量指向托管堆上同一个引用。

如果想在托管堆上创建另外的一份数组实例,通常使用Array.Copy方法。

class Program
{
static void Main(string[] args)
{
int[] a = {1, 3, 6};
int[] b =new int[a.Length];
Array.Copy(a,0,b,0,a.Length);

MyArrCopy myArrCopy = new MyArrCopy();
myArrCopy.Display(a);
Console.ReadKey();
}
}

public class MyArrCopy
{
public void Display(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
if (i != 0)
{
Console.Write(",");
}
Console.Write(arr[i]);
}
}
}

在数据量大的情况下,使用Buffer.BlockCopy方法将会拥有更高的复制效率。

分别测试使用Buffer.BlockCopy和Array.Copy的区别。

public class CopyTest
{
private int[] _myArr;//数组源
private int[] _blockArr=new int[10000];//使用 Buffer.BlockCopy的目标数组
private int[] _copyArr=new int[10000];//使用Array.Copy的目标数组

public CopyTest(int[] myArr)
{
_myArr = myArr;
}

public void TestBlockCopy()
{
Stopwatch sw = new Stopwatch();
sw.Start();
Buffer.BlockCopy(_myArr, 0,_blockArr,0,_myArr.Length);
sw.Stop();
Console.WriteLine("使用Buffer.BlockCopy方法:" + sw.ElapsedTicks);
}

public void TestNormalCopy()
{
Stopwatch sw = new Stopwatch();
sw.Start();
Array.Copy(_myArr, 0, _copyArr,0, _myArr.Length);
sw.Start();
Console.WriteLine("使用Array.Copy方法:" + sw.ElapsedTicks);
}
}

客户端。

int[] a = new int[10000];
for (int i = 0; i < 10000; i++)
{
a[i] = i;
}

var copyTest = new CopyTest(a);
copyTest.TestBlockCopy();
copyTest.TestNormalCopy();

Console.ReadKey();
}

时间: 2024-08-10 02:10:47

C#复制数组的两种方式,以及效率比较的相关文章

springMVC两种方式实现多文件上传及效率比较

springMVC实现 多文件上传的方式有两种,一种是我们经常使用的以字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传.这两种方式对于实 现多文件上传效率上却有着很大的差距,下面我们通过实例来看一下这两种方式的实现方式,同时比较一下在效率上到底存在着多大的差距. 1.下载相关jar包. 需要引入的jar出了springMVC的jar包外,还需要引入 com.springsource.org.apache.commons.fileupload-1.2.0.jar和

生成二维码的两种方式

利用qrcode生成二维码,(qrcode矩形二维码符号) 基于jquery的二维码生成插件qrcode,在页面中调用该插件就能生成对应的二维码.qrcode其实是通过使用jQuery实现图形渲染,画图,支持canvas(HTML5)和table两种方式: 使用插件时 1.首先在页面中加入jquery库文件和qrcode插件. <script type="text/javascript" src="jquery.js"></script> &

WebService的两种方式SOAP和REST比较 (转)

我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript提供API,而淘宝TOP则采用直接的HTTP+XML请求方式,最令我疑惑的是教材上讲的WSDL,UDDI从没有在这些API中出现过.现在知道了WebService原来有两种方式,一是SOAP协议方式,在这种方式下需要WSDL,UDDI等,二是REST方式,这种方式根本不需要WSDL,UDDI等.而且

HashMap遍历的两种方式,推荐使用entrySet()

转自:HashMap遍历的两种方式,推荐使用entrySet() 第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) {     Map.Entry entry = (Map.Entry) iter.next();     Object key = entry.getKey();     Object val = entry.getValue(); } 效率

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端

Oracle并行更新的两种方式(merge/update内联视图)

对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:   创建用例表: create table test1(id number(10),name varchar2(20)); create table test2(id number(10),name varchar2(20));   测试数据: begin insert into test1 values(1,'A'

JAVA中创建字符串的两种方式的区别

我们知道,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建. String x = "abcd"; String y = new String("abcd"); 然而,这两种方式之间的区别是什么?分别应用于哪些情况,之前还不是很懂. 1.双引号的方式 String x = "abcd"; String y = "abcd"; System.out.println(x==y);//true Sys

Java并发编程-创建线程的两种方式及区别

转载请注明:http://blog.csdn.net/UniKylin/article/details/45016117 1.线程和进程的区别 并行:是多个任务在同一时间同时执行,例如多核计算机同时计算的任务可以理解为并行 并发:从微观上看是多个任务抢占一个CPU从而执行自己的任务,轮流执行任务,但是如果遇到资源冲突的时候并没有从根本提高执行效率.但是提高了CPU的使用效率. 前段时间在GitHub上的一幅图可以很好的阐述上面的概念非常形象 2.Java中创建线程的两种方式 1.第一种方式:直接

java文件读写的两种方式

今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOException { io(); buffer(); } /** * 以流的形式读写 可以使用任何文件 特别是二进制文件 * * @author hh * @date 2014-12-11 * @throws IOException */ public static void io() throws IOExce