如何在C#中从数组执行ZERO-COPY赋值

时间:2011-04-21 17:48:24

标签: arraycopy

好的,所以我拼命想在C#中做一些零复制作业。手头的问题是我有一个字节数组,比如array1。我需要指向该数组中的特定位置,现在棘手的部分是实际上不会从该特定位置向前复制字节直到结束,而是某种方式我必须能够访问这些字节。为了使这一小部分数据可访问,我必须将它放在另一个字节数组中,比如array2。我不能使用Array.Copy()因为它将创建数据的副本,现在我必须使用不安全/固定的构造并指向该特定的数据部分。简单来说,不复制就可以通过另一个数组或其他东西访问现有数据。我似乎缺乏那种神奇的知识!

byte[] array1 ---> contains data say 10 elements
byte[] array2 ---> This must have the data from array1 from element say, 2-8 without  
copying the data from array1

非常感谢任何帮助,

由于 (P.S.甚至可能吗?)

好的所以我做了一些基准测试,最后遇到了一些障碍。感谢关于ArraySegment的dtb建议,它解决了我的大多数问题。

结果如下(根据我的要求发布)

Construct     Size    Elements accessed      Iterations       Time
_____________________________________________________________________

Array.Copy     1000        100                 1000000       53.7 ms
ArraySegment   1000        100                 1000000       23.04 ms

使用core2 duo - 2.53 Ghz,2GB Ram,在.NET 3.5下运行(C#,VS2008)

我比几分钟前更开心。干杯给Dtb!

代码如下。将会发现任何指出的缺陷。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ArrayCopyArraySementProfiling
{
    class Program
    {
        public static Stopwatch stopWatch = new Stopwatch();
        public static TimeSpan span = new TimeSpan();
        public static double totalTime = 0.0;
        public static int iterations = 1000000;

        static void Main(string[] args)
        {
            int size = 1000;
            int startIndex = 0;
            int endIndex = 99;
            byte[] array1 = new byte[size];
            byte[] array2 = new byte[endIndex - startIndex + 1];

            for (int index = startIndex; index < size ; index++)
            {
                array1[index] = (byte)index;
            }

            ArraySegment<byte> arraySeg;
            for (int index = 0; index < iterations; index++)
            {
                stopWatch.Start();
                arraySeg = new ArraySegment<byte>(array1, startIndex, endIndex);
                stopWatch.Stop();
                totalTime += stopWatch.Elapsed.TotalMilliseconds;
            }
            Console.WriteLine("ArraySegment:{0:F6}", totalTime / iterations);
            stopWatch.Reset();
            totalTime = 0.0;

            for (int index = 0; index < iterations; index++)
            {
                stopWatch.Start();
                Array.Copy(array1, startIndex, array2, 0, endIndex);
                stopWatch.Stop();
                totalTime += stopWatch.Elapsed.TotalMilliseconds;
            }
            Console.WriteLine("Array.Copy:{0:F6}", totalTime / iterations);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

在.NET中,数组不能指向另一个数组。您可以做的是沿array1传递偏移量和长度,以便接收者从该偏移量读取给定长度的数组,而不是从0开始array.Length

查看ArraySegment<T> Structure