我遇到了一个有趣的 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/