针对iOS应用优化迭代for循环

时间:2016-04-26 19:18:26

标签: ios arrays swift optimization instruments

这可能听起来有点愚蠢的问题;但由于我是编程新手,我想你们中的一些人可能会在这方面帮助我。我有以下代码片段:

    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次。当我查看仪器的性能时,我发现这部分代码占用了57.4%的运行性能时间。我在下面发布了一张快照。

Performance Snapshot!

有没有办法优化它?我想把它转换成一维数组并进行计算;但它只会使代码在可读性方面更加混乱。

编辑:

 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,并相应地进行了上述计算。

1 个答案:

答案 0 :(得分:1)

只是一个简单的开始:你有三个循环用于i,j和k,然后你有三个内部循环,你将东西添加到同一元素A2 [0] [i] [j] [k]。所以你拿这个:

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]
         }
    }
}

并将其更改为:

let sum = A2[0][j][i][k]
for di in 0..<5{
    for dj in 0..<5{
        for q in 0..<32{
            sum += T2[0][j+dj+1][i+di+1][q]*W2[k][q][dj][di]
         }
    }
}
A2[0][j][i][k] = sum

现在我假设你不止一次这样做(因为1000万不是那么多),所以也许告诉我们你怎么称呼它多次 - 也许你可以保存一些东西。

顺便说一句。遇到这种问题,您可能会发现调试版本和发布版本之间存在巨大的差异。

如果您可以重新排列数组W2,以便可以将其作为W2 [k] [dj] [di] [q]访问,那么这可能会有很大帮助。