优化 iOS 应用的迭代 for 循环 [关闭]

Posted

技术标签:

【中文标题】优化 iOS 应用的迭代 for 循环 [关闭]【英文标题】:Optimizing an iterative for loop for iOS app [closed] 【发布时间】: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 上。 【参考方案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] 访问,那可能会有很大帮助。

【讨论】:

感谢您的回复。我现在就试试这个。是的,调试版本和发布版本之间存在差异。发布构建比调试慢。是这样吗? 发布版本应该更快。你是用-OFast编译吗? 发布版本比较慢?这很奇怪。 我的错。发布构建更快!但是,当我在 iPhone 模拟器和 iPhone 手机中运行代码时,会有很大的不同。

以上是关于优化 iOS 应用的迭代 for 循环 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

关于多层for循环迭代的效率优化问题

如何在Django视图中使用for循环返回每次迭代[关闭]

使用嵌套循环迭代 m^n 组合[关闭]

湖南大学python头歌实训-循环语句

web性能优化--算法优化

数组的循环和迭代