C# 数组Copy的效率问题

在C#中数组Copy是比较常用的,网上有很多帖子,但是写的也不是很完整,今天我对一些比较常用的方法做了一下总结

1、  数组自带的CopyTo方法

private static void NewMethod(byte[] da, byte[] da1)
        {
            Stopwatch dd = new Stopwatch();
            dd.Start();
            for(int i=0;i< tcount;i++)
            {
                da.CopyTo(da1, 0);
            }
            dd.Stop();
            Console.WriteLine("array copyto {0}", dd.ElapsedMilliseconds);
        }

2、 数组的clone方法

  private static void NewMethod1(byte[] da)
        {
            Stopwatch dd = new Stopwatch();
            dd.Start();
            byte[] ddd = null;
            for (int i = 0; i < tcount; i++)
            {
                //ddd=da.Clone() as byte[];
                da.Clone();
            }
            dd.Stop();
            Console.WriteLine("array clone {0}", dd.ElapsedMilliseconds);
        }

3、 Buffer.BlockCopy方法

  private static void NewMethod2(byte[] da, byte[] da1)
        {
            Stopwatch dd = new Stopwatch();
            dd.Start();
            for (int i = 0; i < tcount; i++)
            {
                Buffer.BlockCopy(da, 0, da1, 0, da.Length);
            }
            dd.Stop();
            Console.WriteLine("Buffer.BlockCopy {0}", dd.ElapsedMilliseconds);
        }

4、Array.Copy方法

   private static void NewMethod3(byte[] da, byte[] da1)
        {
            Stopwatch dd = new Stopwatch();
            dd.Start();
            for (int i = 0; i < tcount; i++)
            {
                Array.Copy(da, 0, da1, 0, da.Length);
            }
            dd.Stop();
            Console.WriteLine(" Array.Copy {0}", dd.ElapsedMilliseconds);
        }

5、Array.ConstrainedCopy方法

    private static void NewMethod4(byte[] da, byte[] da1)
        {
            Stopwatch dd = new Stopwatch();
            dd.Start();
            for (int i = 0; i < tcount; i++)
            {
                Array.ConstrainedCopy(da, 0, da1, 0, da.Length);
            }
            dd.Stop();
            Console.WriteLine(" Array.ConstrainedCopy {0}", dd.ElapsedMilliseconds);
        }

6、Marshal.Copy方法

  private static void NewMethod5(byte[] da, byte[] da1)
        {
            Stopwatch dd = new Stopwatch();
            dd.Start();
            //GCHandle handle= GCHandle.Alloc(da1, GCHandleType.Pinned);  //获取数组的Intptr
            //IntPtr des = handle.AddrOfPinnedObject();
            IntPtr des = Marshal.AllocHGlobal(da1.Length);  //获取数组的Intptr
            for (int i = 0; i < tcount; i++)
            {
                Marshal.Copy(da, 0, des, da.Length);
            }
            //handle.Free();
            dd.Stop();
            Console.WriteLine("  Marshal.Copy {0}", dd.ElapsedMilliseconds);
        }

主函数调用

 private const int tcount=10000;    //copy的次数
        static void Main(string[] args)
        {
            string path = @"D:\C#Test\ChatServer\TestUdp\bin\Debug\1.txt";   这是一个1.91M的文本文件
            using (FileStream file = File.Open(path, FileMode.Open))
            {
                byte[] da = new byte[file.Length];
                byte[] da1 = new byte[file.Length];
                byte[] da11 = new byte[file.Length];
                byte[] da12 = new byte[file.Length];
                byte[] da13 = new byte[file.Length];
                byte[] da14 = new byte[file.Length];
                file.Read(da, 0, da.Length);


                
                NewMethod(da, da1);
                NewMethod1(da);
                NewMethod2(da, da11);
                NewMethod3(da, da12);
                NewMethod4(da, da13);
                NewMethod5(da, da14);
            }
            Console.ReadKey();
        }


结果如下:


Marshal.Copy的效率是最高的,接下来是Buffer.Copy(这个方法有网友说是c写的),clone效率是最低的

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值