Arrays 提高阵列访问速度

Arrays 提高阵列访问速度,arrays,swift,optimization,Arrays,Swift,Optimization,现在我正在优化我的代码,但我真的被卡住了。 我追踪了运行多个命令所需的时间,得出结论:访问三维阵列“花费”的时间最多 array1是[结构数据类型], array2是[[[UInt8]]] 我使用: for a in 0 ..< 600 { for b in 0..< 900 { array1[counter] = Struct(s:array2[var1][var2][var3]) } } 适用于0..

现在我正在优化我的代码,但我真的被卡住了。 我追踪了运行多个命令所需的时间,得出结论:访问三维阵列“花费”的时间最多

array1是[结构数据类型], array2是[[[UInt8]]]

我使用:

for a in 0 ..< 600 {
    for b in 0..< 900 {
        array1[counter] = Struct(s:array2[var1][var2][var3])
    }
}
适用于0..<600{
对于0..<900中的b{
array1[counter]=Struct(s:array2[var1][var2][var3])
}
}
我用过:

for a in 0 ..< 600 {
    for b in 0..< 900 {
         array1[counter] = Struct(s:UInt8(123))
    }
}
适用于0..<600{
对于0..<900中的b{
数组1[计数器]=结构(s:UInt8(123))
}
}
这给了我巨大的鼓舞,但毫无用处。因此,我得出结论,访问array2需要的时间最多。 包含第一个样本的循环运行时间为0.025秒,第二个循环运行时间为0.005秒

如何更快地访问三维阵列?我试图把它做成一个一维数组,这造成了很多麻烦,因为它不明确使用哪个索引它也不是很快,因为我使用的Swift 4已经进行了优化。
非常感谢你的帮助

如果要将三维尺寸数组
(nX、nY、nZ)
表示为一维数组,请使用以下转换:

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

如果要将三维尺寸数组
(nX、nY、nZ)
表示为一维数组,请使用以下转换:

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


我们能看看你的密码吗?除了回答您的具体问题外,我们还可以建议您是否有更好的解决方案。var1、var2和var3源自非常具体且难以理解的数学运算。我编辑了上面的代码,所以所有内容都包括在内。你说
array2
是一个三维数组,但你也说它是
[UInt8]
。那没有道理。请你举一个稍微清楚一点的例子好吗?在显示的代码中,循环内部的代码不依赖于
a
b
;编译器可能只是将其从循环中提升出来,然后从一开始就消除循环。你说
var1
var2
var3
“源于数学运算”,你是否认为这些运算可能是瓶颈而不是数组访问?我怀疑索引到一个三层嵌套的数组要比平面数组慢很多。另外,请检查一下,您是在启用优化的情况下构建的,对吗?
[[[UInt8]]]
不是三维数组。它是一个数组的数组。每个子阵列的大小可能不同。这与多维数组不同。Swift没有内置的多维数组,但它们并不难构建。有关二维示例,请参见。(这依赖于与Imran的解决方案基本相同的数学;它只是将其打包在一个更方便的结构中。)我们可以看到您的代码吗?除了回答您的具体问题外,我们还可以建议您是否有更好的解决方案。var1、var2和var3源自非常具体且难以理解的数学运算。我编辑了上面的代码,所以所有内容都包括在内。你说
array2
是一个三维数组,但你也说它是
[UInt8]
。那没有道理。请你举一个稍微清楚一点的例子好吗?在显示的代码中,循环内部的代码不依赖于
a
b
;编译器可能只是将其从循环中提升出来,然后从一开始就消除循环。你说
var1
var2
var3
“源于数学运算”,你是否认为这些运算可能是瓶颈而不是数组访问?我怀疑索引到一个三层嵌套的数组要比平面数组慢很多。另外,请检查一下,您是在启用优化的情况下构建的,对吗?
[[[UInt8]]]
不是三维数组。它是一个数组的数组。每个子阵列的大小可能不同。这与多维数组不同。Swift没有内置的多维数组,但它们并不难构建。有关二维示例,请参见。(这依赖于与Imran的解决方案基本相同的数学;它只是将其打包到一个更方便的结构中。)这会带来什么性能提升?此外,您还可以通过两组不同的数字(x、y和z)访问某些索引(在示例43中)。这就是我所说的不明确的意思。你是说你可以通过两组不同的数字来获得一些索引?你能举个例子吗?@Imran你的意思是最后的
+x
,而不是
+nux
,对吗?另请注意,对于变量名,Swift约定是
lowerCamelCase
,而不是
snake\u case
Imran
使用的是使用连续内存的一维数组。。这样访问它要比使用数组数组快得多,数组数组数组很可能有对每个数组维度的引用(3次分配)。它必须偏移到每一行才能获得正确的值。那么,使用1d阵列地址Swift 4的速度提高了吗?我记得WWDC有人说他们缩小了一维阵列和多维阵列在速度方面的差异?这会带来什么性能提升?此外,您还可以通过两组不同的数字(x、y和z)访问某些索引(在示例43中)。这就是我所说的不明确的意思。你是说你可以通过两组不同的数字来获得一些索引?你能举个例子吗?@Imran你的意思是最后的
+x
,而不是
+nux
,对吗?另请注意,对于变量名,Swift约定是
lowerCamelCase
,而不是
snake\u case
Imran
使用的是使用连续内存的一维数组。。这样访问它要比使用数组数组快得多,数组数组数组很可能有对每个数组维度的引用(3次分配)。这是必须的