从Byte数组中截取指定的一段数据常使用的方法有两种Array.Copy和 Linq ,这个是我们常见的方式,那么它们的性能差别又如何呢?以下是简单的测试代码

public void Test()
{
    const int MAX = 1000000;

    byte[] arrByte1 = { 11, 22, 33, 44, 55, 66 };
    byte[] arrByte2 = new byte[2];
    Stopwatch sw = new Stopwatch();

    // Array.Copy
    sw.Start();
    for (int i = 0; i < MAX; i++)
    {
        Array.Copy(arrByte1, 2, arrByte2, 0, 2);
    }
    sw.Stop();
    Console.WriteLine("Array.Copy: {0}ms", sw.ElapsedMilliseconds);

    // Linq
    sw.Restart();
    for (int i = 0; i < MAX; i++)
    {
        arrByte2 = arrByte1.Skip(2).Take(2).ToArray();
    }
    sw.Stop();
    Console.WriteLine("Linq: {0}ms", sw.ElapsedMilliseconds);
}

测试结果:
Array.Copy: 28ms
Linq: 189ms

如果我倍加大数据量呢?下面代码:

public void Test()
{
    const int MAX = 1000000;

    int[] arrByte1 = Enumerable.Range(0, 1000).ToArray();
    int[] arrByte2 = new int[500];
    Stopwatch sw = new Stopwatch();

    // Array.Copy
    sw.Start();
    for (int i = 0; i < MAX; i++)
    {
        Array.Copy(arrByte1, 500, arrByte2, 0, 500);
    }
    sw.Stop();
    Console.WriteLine("Array.Copy: {0}ms", sw.ElapsedMilliseconds);

    // Linq
    sw.Restart();
    for (int i = 0; i < MAX; i++)
    {
        arrByte2 = arrByte1.Skip(500).Take(500).ToArray();
    }
    sw.Stop();
    Console.WriteLine("Linq: {0}ms", sw.ElapsedMilliseconds);
}

结果:
Array.Copy: 186ms
Linq: 12666ms

当然有人说到了:Buffer.BlockCopy() 经过测试这个和Array.Copy很相近。就不再写代码了。

https://stackoverflow.com/questions/30636113/get-subarray-of-byte