几种数组复制的效率比较

本次测试主要使用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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值