【发布时间】:2016-04-26 19:18:25
【问题描述】:
这听起来有点愚蠢;但由于我是编程新手,我想你们中的一些人可能会在这方面帮助我。我有以下 sn-p 代码:
for k in 0..<64{
for i in 0..<14{
for j in 0..<14{
for di in 0..<5{
for dj in 0..<5{
for q in 0..<32{
A2[0][j][i][k] = A2[0][j][i][k] + T2[0][j+dj+1][i+di+1][q]*W2[k][q][dj][di]
}
}
}
}
}
}
在这里可以看到 for 循环运行了 64*14*14*5*5*32 = 10035200 次。当我查看 Instruments 的性能时,我发现这部分代码占用了 57.4% 的运行性能时间。我在下面发布了一张快照。
有没有办法优化它?我想把它转换成一维数组并进行计算;但这只会使代码在可读性方面更加令人困惑。
编辑:
var A2: [[[[Float]]]] = [[[[Float]]]](count: 1, repeatedValue: [[[Float]]](count: 14, repeatedValue: [[Float]](count: 14, repeatedValue: [Float](count: 64, repeatedValue: Float()))))
var T2: [[[[Float]]]] = [[[[Float]]]](count: 1, repeatedValue: [[[Float]]](count: 20, repeatedValue: [[Float]](count: 20, repeatedValue: [Float](count: 32, repeatedValue: Float()))))
for k in 0..<32{
for i in 0..<14{
for j in 0..<14{
T2[0][i+3][j+3][k] = HP1[0][i][j][k]
}
}
}
HP1 是先前计算的数组; W2是之前计算出来的,上面的计算也是做相应的。
【问题讨论】:
-
好像代码还没有混淆?首先,这些计算可以在后台线程上完成吗?如果是这样,请将其转储到后台线程并继续移动。如果你绝对必须做这个疯狂的事情并且性能是重中之重,那么牺牲可读性使其尽可能优化。更少的循环(通常)更快。
-
你会如何优化它?
-
你能描述一下这个问题吗,这里到底计算了什么?
-
我在 EDIT 中发布了更详细的代码版本。我希望这会有所帮助。
-
我发现在使用 libdispatch 的
dispatch_apple()时性能得到了巨大的提升。然而,它是在 Mac 上。
标签: ios arrays swift optimization instruments