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

ОК, поэтому я отчаянно пытаюсь выполнить некоторые задания 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 ГБ 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 Ответ

2 голосов
/ 21 апреля 2011

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

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

...