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