好的,所以我拼命想在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);
}
}
}
答案 0 :(得分:2)
在.NET中,数组不能指向另一个数组。您可以做的是沿array1
传递偏移量和长度,以便接收者从该偏移量读取给定长度的数组,而不是从0
开始array.Length
。