C#中复制数组的两种常用方式及性能对比
在C#开发中,直接赋值仅实现引用传递而非数据复制。若需创建独立的数组实例(即深拷贝),通常使用 Array.Copy 或 Buffer.BlockCopy。本文通过具体代码示例对比两者用法,并结合基准测试说明在大数据量数值处理时 Buffer.BlockCopy 的性能优势。
基础操作:创建数组深拷贝
C# 中变量赋值默认是引用传递,即两个变量指向内存中的同一块托管堆区域。如需物理上创建一份独立副本以支持后续独立修改,必须调用特定的复制方法。常用的方式包括基于逻辑元素的 Array.Copy 和基于底层字节的 Buffer.BlockCopy。
第1步:使用Array.Copy实现基本复制
Array.Copy 适用于所有类型的数组,包含引用类型、值类型等通用场景。该方法是 C# 中最标准的数组拷贝方式。
class Program
{
static void Main(string[] args)
{
// 定义源数组
int[] a = { 1, 3, 6 };
// 开辟同等大小的目标数组空间
int[] b = new int[a.Length];
// 执行从索引0到末尾的数据拷贝
Array.Copy(a, 0, b, 0, a.Length);
MyArrCopy myArrCopy = new MyArrCopy();
myArrCopy.Display(b); // 显示新数组b的内容
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]);
}
}
}在上述操作中,b 被分配了新的内存地址,修改 b 不会影响到 a,成功实现了数据的隔离。
进阶优化:Buffer.BlockCopy的高频应用场景
在处理大量整数或浮点数等固定长度基元类型时,Buffer.BlockCopy 能够提供更优的执行速度。该方法直接在字节层面上进行内存拷贝,省去了部分装箱拆箱或边界检查开销。
第2步:设计性能对比测试环境
为了直观对比两者的时间开销,我们构造一个长度为 10,000 的大规模整型数组,并使用 Stopwatch 计时器记录两种拷贝方式的耗时差异。
public class CopyTest
{
private int[] _myArr; // 原始数据源
private int[] _blockArr; // Buffer.BlockCopy的目标缓冲区
private int[] _copyArr; // Array.Copy的目标缓冲区
public CopyTest(int[] myArr)
{
_myArr = myArr;
_blockArr = new int[myArr.Length];
_copyArr = new int[myArr.Length];
}
// 测试BlockCopy效率
public void TestBlockCopy()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
// 参数:源数组、偏移字节、目标数组、偏移字节、拷贝长度(字节)
Buffer.BlockCopy(_myArr, 0, _blockArr, 0, _myArr.Length * sizeof(int));
sw.Stop();
Console.WriteLine("Buffer.BlockCopy 耗时 ticks: " + sw.ElapsedTicks);
}
// 测试普通Array.Copy效率
public void TestNormalCopy()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
Array.Copy(_myArr, 0, _copyArr, 0, _myArr.Length);
sw.Stop();
Console.WriteLine("Array.Copy 耗时 ticks: " + sw.ElapsedTicks);
}
}第3步:执行客户端压测脚本
在主程序中初始化测试数据集并触发上述测试类的方法。运行后将得到不同方法的执行 Tick 数作为参考依据。
// 构建十万级别的压测数据
int[] largeData = new int[10000];
for (int i = 0; i < 10000; i++)
{
largeData[i] = i;
}
var copyTest = new CopyTest(largeData);
copyTest.TestBlockCopy();
copyTest.TestNormalCopy();
Console.ReadKey();
通过控制台输出的 Tick 计数可以看出,针对纯整数类型且数据量庞大的场景下,Buffer.BlockCopy 由于其底层的字节搬运特性,往往能在相同时间内完成比 Array.Copy 更多的操作或者以更小的系统开销完成任务。当然需注意 Buffer.BlockCopy 仅在处理具有特定长度(如 byte, short, int, long, float, double 等)的数据结构时才能发挥最大效能,对于自定义类或其他复杂对象,请优先坚持使用 Array.Copy。
以上就是C#中数组复制两种方式及其效率对比的详细内容,更多关于C#高效数据处理与性能优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









