比较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);
        }
    }
}

运行结果如下:

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。