ios - 具有实例属性数组的 Swift 性能

标签 ios arrays swift performance

我遇到了一个有趣的 Swift 性能问题,正在寻找一些建议,分析为什么会发生这种情况。

我有一个算法需要在一个循环中进行数十万次数组访问。我发现如果我将数组作为实例属性引用(从同一个类实例内部),性能会很差。似乎该数组在每次迭代时都被取消引用。这似乎很奇怪,因为数组是执行工作的相同 类的成员。难道 self.x 不需要 x 一遍又一遍地取消引用吗?等效的 Java 代码没有相同的性能问题。

在下面的示例中,test3 需要 0.5 秒,test4 需要 0.15 秒。

我真的每次做某事时都必须检查我的所有代码并分配局部范围的数组吗?

欢迎任何提示/想法。我将编译器优化设置为 Fast-O。

西蒙

编辑:本文在此处阐明了答案: https://developer.apple.com/swift/blog/?id=27

希望对您有所帮助。长话短说,类范围变量的 private/final 将消除不需要的间接访问数组的需要。

class MyClass {

    var array_1 = [Int64] (count: 16 , repeatedValue: 0)
    var array_2 = [Int64] (count: 16 , repeatedValue: 0)


    func runTest3() {
        // test #3
        //
        let start = NSDate().timeIntervalSince1970
        for i in 0 ... 10000000 {
            if (array_1[ i%16 ] & array_2[ i%16 ] ) != 0  {
                // whatever
            }
        }
        let passed = NSDate().timeIntervalSince1970 - start
        print("3 time passed: \(passed)")
    }

    func runTest4() {
        // test #4
        //
        let start = NSDate().timeIntervalSince1970
        let localArray_1 = self.array_1
        let localArray_2 = self.array_2
        for i in 0 ... 10000000 {
            if (localArray_1[ i%16 ] & localArray_2[ i%16 ] ) != 0  {
                // whatever
            }
        }
        let passed = NSDate().timeIntervalSince1970 - start
        print("4 time passed: \(passed)")
    }
}

最佳答案

https://developer.apple.com/swift/blog/?id=27

类范围变量的 Private/Final 消除了性能问题。原因在上面的文章中。感谢大家的帮助。

关于ios - 具有实例属性数组的 Swift 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682450/

相关文章:

ios - Swift ios Firebase 不返回任何数据

c - 使用模数循环 9-0 并打印

javascript - 如何在 JavaScript 中反转数组,同时保留原始数组的原始值?

javascript - Array.from 与 for 循环遍历类似数组的对象

swift - 发送本地通知

ios - 运行失败 'lipo' ,lib有相同的架构

ios - CollectionView 重新加载数据不工作 swift ios?

ios - 进度 View 翻转和缩放

ios - 火力地堡 : Retrieve childByAutoID from Realtime Database

ios - 未更新面容 ID 消息