我有一个3D数据阵列,代表一堆2D数据。在这种特殊情况下,堆栈只包含一个元素。 将此数据映射到线性数组的最快方法是什么?
我打算采取以下方法:
public static int[] ToBuffer<(this int[, ,] buffer3D, int w, int h)
{
int[] buffer = new int[w * h * 1];
for (int i = 0; i < (w * h); i++)
{
buffer[i] = buffer3D[(int)Math.Floor(i / (double)w), i % w, 0];
}
return buffer;
}
但我发现可能有某种方法可以利用数据已经存储在内存中的方式。是否应该在csharp中使用其他映射方法?
答案 0 :(得分:1)
虽然你可能在这里使用一些Linq,但.ToArray()
函数在内部使用一个具有设置大小的数组,然后在它变得太大时替换它 - 不像代码已经发布那样高效。 (见:class Enumerable on Reference Source)
请注意,C#的主要优势,内存管理,也是这种优化的主要缺点 - 因为指针等是高度管理的,以这种方式访问它们以优化这样的代码通常要困难得多C#比其他语言。
答案 1 :(得分:1)
我想,为新数组创建新缓冲区并复制3d数组的缓冲区应该有效:
public static int[] ToBuffer(int[, ,] buffer3D, int w, int h) {
int[] buffer = new int[w * h * 1];
Buffer.BlockCopy(buffer3D, 0, buffer, 0, w * h * sizeof(int));
return buffer;
}