几种数组复制的效率比较

本次测试主要使用Array和Buffer对象的数组复制方法进行效率比较。

对于内存复制,由于要使用Unsafe代码,暂时没有测试。


static void Test(int _size)
{
    Console.WriteLine();
    Console.WriteLine();

    byte[] _src = new byte[_size];
    byte[] _dst = new byte[_size];

    //_src[0] = 1;
    //_src[1] = 2;
    //_src[_size - 2] = 254;
    //_src[_size - 1] = 255;

    for (int i = 0; i < _size; i++)
    {
        _src[i] = (byte)(i % 256);
    }

    System.Diagnostics.Stopwatch _sw;
    _sw = new System.Diagnostics.Stopwatch();


    //方式一;
    _sw.Reset();
    _sw.Start();
    Array.Copy(_src, 0, _dst, 0, _src.Length);
    _sw.Stop();
    Console.WriteLine("数量:{0},Array.Copy 用时:{1} ", _size, _sw.ElapsedTicks);


    //方式二;
    _sw.Reset();
    _sw.Start();
    Array.ConstrainedCopy(_src, 0, _dst, 0, _src.Length);
    _sw.Stop();
    Console.WriteLine("数量:{0},Array.ConstrainedCopy 用时:{1} ", _size, _sw.ElapsedTicks);


    //方式三;
    _sw.Reset();
    _sw.Start();
    System.Buffer.BlockCopy(_src, 0, _dst, 0, _src.Length);
    _sw.Stop();
    Console.WriteLine("数量:{0},Buffer.BlockCopy 用时:{1} ", _size, _sw.ElapsedTicks);

    //方式四 内存操作
    //这个需要unsafe代码,将数组转换为IntPtr,这里不测试;
    //_sw.Start();
    //IntPtr _p1 = ArrayToIntptr(_src);
    //System.Runtime.InteropServices.Marshal.Copy(_src, 0, _p1, _src.Length);
    //_sw.Stop();
    //Console.WriteLine("Buffer.BlockCopy 用时: " + _sw.ElapsedTicks.ToString());


}


//外部调用;
Test(10000);
Test(100000);
Test(1000000);

测试结果如下:

-----------------------------------------------------------------------------------

数量:10000,Array.Copy 用时:19
数量:10000,Array.ConstrainedCopy 用时:17
数量:10000,Buffer.BlockCopy 用时:6


数量:100000,Array.Copy 用时:315
数量:100000,Array.ConstrainedCopy 用时:67
数量:100000,Buffer.BlockCopy 用时:59


数量:1000000,Array.Copy 用时:2889
数量:1000000,Array.ConstrainedCopy 用时:569
数量:1000000,Buffer.BlockCopy 用时:534

 

 

数组复制的方法在不同编程语言中有多种实现方式,以下是一些常见的方法: ### Java 语言 - **浅克隆**:对于对象数组,浅克隆只复制对象的引用,而不是对象本身;对于基本类型数组,浅克隆复制的是值。可以使用 `Object.clone()` 方法实现浅克隆。 ```java int[] source = {1, 2, 3, 4, 5}; int[] destination = source.clone(); ``` - **深克隆**:对于对象数组,深克隆会复制对象本身,而不是引用。需要手动实现对象的深克隆逻辑。 - **使用 `System.arraycopy()` 方法**:该方法可以将一个数组的指定部分复制到另一个数组中。 ```java int[] source = {1, 2, 3, 4, 5}; int[] destination = new int[source.length]; System.arraycopy(source, 0, destination, 0, source.length); ``` - **使用 `Arrays.copyOf()` 方法**:该方法可以复制指定长度的数组元素。 ```java import java.util.Arrays; int[] source = {1, 2, 3, 4, 5}; int[] destination = Arrays.copyOf(source, source.length); ``` - **使用 `Arrays.copyOfRange()` 方法**:该方法可以复制数组的指定范围。 ```java import java.util.Arrays; int[] source = {1, 2, 3, 4, 5}; int[] destination = Arrays.copyOfRange(source, 0, source.length); ``` ### C 语言 - **使用循环逐个复制数组元素**:通过循环遍历数组,将每个元素从源数组复制到目标数组。 ```c #include <stdio.h> int main() { int source[] = {1, 2, 3, 4, 5}; int destination[5]; int i; // 计算数组的长度 int length = sizeof(source) / sizeof(source[0]); // 逐个复制数组元素 for (i = 0; i < length; i++) { destination[i] = source[i]; } // 打印目标数组以验证复制结果 for (i = 0; i < length; i++) { printf("%d ", destination[i]); } return 0; } ``` - **使用 `memcpy` 函数**:`memcpy` 是 C 标准库中的函数,可以快速复制内存块。 ```c #include <stdio.h> #include <string.h> int main() { int source[] = {1, 2, 3, 4, 5}; int destination[5]; int length = sizeof(source); memcpy(destination, source, length); for (int i = 0; i < 5; i++) { printf("%d ", destination[i]); } return 0; } ``` ### C# 语言 在 C# 中,有多种复制字节数组的方法,例如借鉴文章《比较C#中几种常见的复制字节数组方法的效率 》中提到的方法,还可以使用指针复制方法 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值