使用不安全的代码快速迭代3D数组?

时间:2011-03-14 19:13:40

标签: c# arrays unmanaged loops

我有一段代码,我用两个for循环迭代一个巨大的3D数组。现在我遇到了性能问题,实在太慢了。我该怎么办?

我在某地读过非托管代码可以解决问题。我理解正确:非托管代码在.net引擎之外运行吗?

我在数组迭代中放置了一个不安全块,但它没有帮助。我认为那是因为我仍然使用托管数组。如何将我的数组复制到不安全的数组或获取指向此数组的不安全指针?我试过修复(见下面的代码),但是我遇到了编译器错误。

        byte[, ,] data = original.Data;
        unsafe
        {
            fixed (byte*** dataPtr = (byte***)data)  // data is of type byte[,,]
            {
                for (int i = original.Rows - 1; i >= 0; i--)
                {
                    for (int j = original.Cols - 1; j >= 0; j--)
                    {
                        if (dataPtr[i,j,0] < 100)
                        {
                           dataPtr[i, j, 0] += 100;
                           dataPtr[i, j, 1] += 40;
                           dataPtr[i, j, 2] += 243;
                        }
                        else
                        {
                           dataPtr[i,j,0] = 0;
                        }
                    }
                }
            }

        }

如何在3D数组中使用此固定关键字,是否有助于我的代码更快?

1 个答案:

答案 0 :(得分:2)

如果您想要速度,则不要使用多维数组。您需要使用byte[][][]锯齿状数组,该数组在CLR中进行了大量优化。这个单一的更改可能会充分加速你的循环,你不需要做任何其他事情。