【发布时间】: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]。这没有意义。 -
请你举一个更清楚的例子吗?在您显示的代码中,循环内的代码不依赖于
a或b;编译器可能会将其从循环中提升出来,然后从一开始就消除循环。您说var1、var2和var3“源于数学运算”,您是否认为这些运算可能是瓶颈而不是数组访问?我怀疑对三深嵌套数组的索引比平面数组慢得多。另外,只是为了检查一下,您是在启用优化的情况下构建的吗? -
[[[UInt8]]]不是三维数组。它是一个array-of-arrays-of-arrays。每个子阵列可以具有不同的大小。这与多维数组不同。 Swift 没有内置的多维数组,但构建起来并不难。有关二维示例,请参阅stackoverflow.com/questions/28936824/…。 (这依赖于与 Imran 的解决方案基本相同的数学;它只是将其封装在一个更方便的结构中。)
标签: arrays swift optimization