【问题标题】:Increase Array access speed提高阵列访问速度
【发布时间】:2017-11-26 19:43:31
【问题描述】:

现在我正在优化我的代码,但我真的被困住了。 我跟踪了运行多个命令所需的时间,得出的结论是访问 3 维数组“成本”最多。

array1 是 [Struct 数据类型], array2 是 [[[UInt8]]]

我用:

for a in 0 ..< 600 {
    for b in 0..< 900 {
        array1[counter] = Struct(s:array2[var1][var2][var3])
    }
}

我用过:

for a in 0 ..< 600 {
    for b in 0..< 900 {
         array1[counter] = Struct(s:UInt8(123))
    }
}

这给了我很大的鼓舞,但没用。因此,我得出结论,访问 array2 需要大部分时间。 包含第一个样本的循环在 0.025 秒内运行,第二个在 0.005 秒内运行。

如何更快地访问 3 维数组?我试图把它变成一个 1 暗淡的数组,这造成了很多麻烦,因为它不明确使用哪个索引。 它也不是很快,因为我使用已经优化的 Swift 4。 非常感谢您的所有帮助!

【问题讨论】:

  • 我们可以看看你的代码吗?除了回答您的具体问题外,我们还可以建议您是否有更好的解决方案。
  • var1、var2 和 var3 源于非常具体且难以理解的数学运算。我编辑了上面的代码,所以所有内容都包含在内。
  • 您说array2 是一个三维数组,但您也说它是[UInt8]。这没有意义。
  • 请你举一个更清楚的例子吗?在您显示的代码中,循环内的代码不依赖于ab;编译器可能会将其从循环中提升出来,然后从一开始就消除循环。您说var1var2var3源于数学运算”,您是否认为这些运算可能是瓶颈而不是数组访问?我怀疑对三深嵌套数组的索引比平面数组慢得多。另外,只是为了检查一下,您是在启用优化的情况下构建的吗?
  • [[[UInt8]]] 不是三维数组。它是一个array-of-arrays-of-arrays。每个子阵列可以具有不同的大小。这与多维数组不同。 Swift 没有内置的多维数组,但构建起来并不难。有关二维示例,请参阅stackoverflow.com/questions/28936824/…。 (这依赖于与 Imran 的解决方案基本相同的数学;它只是将其封装在一个更方便的结构中。)

标签: arrays swift optimization


【解决方案1】:

如果您想将维度为 (nX,nY,nZ) 的 3d 数组表示为 1d 数组,请使用以下转换:

a_3d[x][y][z] <-> a_1d[nY*nX*z + nX*y + x]

例如对于3x4x5 数组:

a_3d[1][2][3] corresponds to a_1d[4*3*3+3*2+1] = a_1d[43]

【讨论】:

  • 这会带来哪些性能提升?您还可以通过两组不同的数字(x、y 和 z)达到一些索引(在您的示例 43 中)。这就是我所说的不明确的意思。
  • 你的意思是你可以通过两组不同的数字达到一些索引?你能举个例子吗?
  • @Imran 你的意思是+ x,而不是最后的+ n_x,对吧?另请注意,Swift 约定对于变量名称是 lowerCamelCase,而不是 snake_case
  • Imran 正在使用使用连续内存的一维数组。这样访问它比使用最有可能引用每个数组维度的数组数组快得多(3分配)。它必须偏移到每一行才能获得正确的值。 stackoverflow.com/a/17260025/1462718
  • 那么使用一维数组地址 Swift 4 的速度提升也是如此吗?我想我记得 WWDC 上有人说他们减少了一维数组和多维数组在速度方面的差异?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2011-10-16
相关资源
最近更新 更多