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