Как я могу выполнить назначение ZERO-COPY из массива в C#

Итак, я отчаянно пытаюсь выполнить некоторые задания Zero Copy в C#. Проблема под рукой, у меня есть байтовый массив, скажем, массив1. Мне нужно указать на конкретное местоположение в этом массиве, теперь сложная часть состоит в том, чтобы фактически не копировать байты из этого конкретного местоположения и далее до конца, скорее, мне нужно, чтобы эти байты были доступны. Чтобы сделать эту небольшую часть данных доступной, я должен иметь ее в другом байтовом массиве, скажем, 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

Любая помощь высоко ценится,

Спасибо (PS это вообще возможно?)

Итак, я сделал несколько тестов и, наконец, преодолел некоторые препятствия. благодаря предложению dtb на ArraySegment это решило большинство моих проблем.

Результаты следующие (размещение согласно моему требованию)

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 ГГц, 2 ГБ оперативной памяти, работает под.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 ответ

Решение

В.NET массив не может указывать на другой массив. Что вы можете сделать, это передать смещение и длину вдоль array1Таким образом, получатель читает массив из этого смещения для заданной длины вместо того, чтобы начинать с 0 за array.Length,

Посмотрите на структуру ArraySegment;.

Другие вопросы по тегам