zoukankan      html  css  js  c++  java
  • 比较C#中几种常见的复制字节数组方法的效率[转]

    [原文链接]

       在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffer.BlockCopy,以及System.Buffer.memcpyimpl,由于最后一种需要使用指针,所以本文不引入该方法。 

             本次测试,使用以上前4种方法,各运行1000万次,观察结果。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    
    namespace BenchmarkCopyArray
    {
        class Program
        {
            private const int TestTimes = 10000000;
            static void Main()
            {
                var testArrayCopy = new TestArrayCopy();
                TestCopy(testArrayCopy.TestBinaryReader, "Binary.ReadBytes");
                TestCopy(testArrayCopy.TestConvertToList, "ConvertToList");
                TestCopy(testArrayCopy.TestArrayDotCopy, "Array.Copy");
                TestCopy(testArrayCopy.TestBlockCopy, "Buffer.BlockCopy");
                Console.Read();
            }
    
            private static void TestCopy(Action testMethod, string methodName)
            {
                var stopWatch = new Stopwatch();
                stopWatch.Start();
                for (int i = 0; i < TestTimes; i++)
                {
                    testMethod();
                }
                testMethod();
                stopWatch.Stop();
                Console.WriteLine("{0}: {1} seconds, {2}.", methodName, stopWatch.Elapsed.Seconds, stopWatch.Elapsed.Milliseconds);
            }
        }
    
        class TestArrayCopy
        {
            private readonly byte[] _sourceBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
            public void TestBinaryReader()
            {
                var binaryReader = new BinaryReader(new MemoryStream(_sourceBytes));
                binaryReader.ReadBytes(_sourceBytes.Length);
            }
    
            public void TestConvertToList()
            {
                IList<byte> bytesSourceList = new List<byte>(_sourceBytes);
                var bytesNew = new byte[_sourceBytes.Length];
                bytesSourceList.CopyTo(bytesNew, 0);
            }
    
            public void TestArrayDotCopy()
            {
                var bytesNew = new byte[_sourceBytes.Length];
                Array.Copy(_sourceBytes, 0, bytesNew, 0, _sourceBytes.Length);
            }
    
            public void TestBlockCopy()
            {
                var bytesNew = new byte[_sourceBytes.Length];
                Buffer.BlockCopy(_sourceBytes, 0, bytesNew, 0, _sourceBytes.Length);
            }
        }
    }

    运行结果如下:

  • 相关阅读:
    关于前端基础框架的思考和尝试
    通过当前IP获取当前网卡的MAC地址
    shell及脚本2——shell 环境及命令
    shell及脚本1——变量
    linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题
    大于16MB的QSPI存放程序引起的ZYNQ重启风险
    insmod模块的几种常见错误
    shell及脚本3——正则表达式
    修改/etc/profile和/etc/environment导致图形界面无法登陆的问题
    Sql 2008的merge关键字
  • 原文地址:https://www.cnblogs.com/flyant/p/4373552.html
Copyright © 2011-2022 走看看