Как я могу выполнить назначение 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