如何高效地进行数组复制?
如果把一个变量值复制给另外一个数组变量,那么2个变量指向托管堆上同一个引用。
如果想在托管堆上创建另外的一份数组实例,通常使用Array.Copy方法。
classPRogram
{staticvoidMain(string[] args)
{int[] a = {1,3,6};int[] b =newint[a.Length];
Array.Copy(a,0,b,0,a.Length);
MyArrCopy myArrCopy=newMyArrCopy();
myArrCopy.Display(a);
Console.ReadKey();
}
}publicclassMyArrCopy
{publicvoidDisplay(int[] arr)
{for(inti =0; i < arr.Length; i++)
{if(i !=0)
{
Console.Write(",");
}
Console.Write(arr[i]);
}
}
}
在数据量大的情况下,使用Buffer.BlockCopy方法将会拥有更高的复制效率。
分别测试使用Buffer.BlockCopy和Array.Copy的区别。
publicclassCopyTest
{privateint[] _myArr;//数组源privateint[] _blockArr=newint[10000];//使用 Buffer.BlockCopy的目标数组privateint[] _copyArr=newint[10000];//使用Array.Copy的目标数组publicCopyTest(int[] myArr)
{
_myArr=myArr;
}publicvoidTestBlockCopy()
{
Stopwatch sw=newStopwatch();
sw.Start();
Buffer.BlockCopy(_myArr,0,_blockArr,0,_myArr.Length);
sw.Stop();
Console.WriteLine("使用Buffer.BlockCopy方法:"+sw.ElapsedTicks);
}publicvoidTestNormalCopy()
{
Stopwatch sw=newStopwatch();
sw.Start();
Array.Copy(_myArr,0, _copyArr,0, _myArr.Length);
sw.Start();
Console.WriteLine("使用Array.Copy方法:"+sw.ElapsedTicks);
}
}
客户端。
int[] a =newint[10000];for(inti =0; i <10000; i++)
{
a[i]=i;
}varcopyTest =newCopyTest(a);
copyTest.TestBlockCopy();
copyTest.TestNormalCopy();
Console.ReadKey();
}