【问题标题】:Fast iterating over 3D array with unsafe code?使用不安全代码快速迭代 3D 数组?
【发布时间】:2011-03-14 19:13:39
【问题描述】:

我有一段代码在其中迭代一个带有两个 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 数组中使用这个固定关键字,是否有助于加快我的代码速度?

【问题讨论】:

  • 以后,您可以通过单击问题正文和标签下方的编辑链接来编辑标签或问题以提供更多信息。答案部分仅针对您的问题的潜在解决方案。
  • 不安全代码是不是非托管代码。不安全只是意味着它无法被运行时验证并需要更高的权限才能执行。非托管代码是 .NET Framework 之外的代码。
  • 编译错误可能是因为byte***是错误的类型。多维数组是通过byte* 访问的单个内存块和一些计算索引的数学(基于单个索引和数组大小)。

标签: c# arrays unmanaged loops


【解决方案1】:

如果你想要速度,就不要使用多维数组。您需要使用 byte[][][] 锯齿状数组,该数组在 CLR 中进行了高度优化。这一单一更改可能会充分加快您的循环速度,您无需执行任何其他操作。

【讨论】:

  • 不,您使用带有rows*columns*planes 元素的一维数组。更好的数据局部性,更少的间接级别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2018-06-08
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多