您的位置:首页 > 编程语言 > C#

C#中copy的效率问题,很不错,学习!

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

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

[csharp] view
plain copy

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);  

        }  

    }  

}  

       运行结果如下:



   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: