快速性能问题:本地数组与全局数组

时间:2014-11-15 03:13:33

标签: ios arrays performance swift

在swift中使用数组时发现了一个奇怪的性能问题。

在以下两个演示代码中,我尝试为数组执行随机复制。 这两个代码之间的唯一区别是数组定义的位置。

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var array: [Int] = [] /* HERE */
        var n: Int = 10000
        var timer = NSDate()
        for i in 0 ..< n {
            array.append(i)
        }
        println("append \(n) elements \(NSDate().timeIntervalSinceDate(timer))")
        for i in 0 ..< n {
            var p: Int = Int(arc4random_uniform(UInt32(array.count - i))) + i
            array[i] = array[p]
        }
        println("permutation \(array.count) elements \(NSDate().timeIntervalSinceDate(timer))")
    }
}
// append 10000 elements 0.0597179532051086
// permutation 10000 elements 0.108937978744507

但是当我在函数外部(类内)移动数组的定义时,发生了一些奇怪的事情。

import UIKit
class ViewController: UIViewController {
    var array: [Int] = [] /* HERE */
    override func viewDidLoad() {
        super.viewDidLoad()

        var n: Int = 10000
        var timer = NSDate()
        for i in 0 ..< n {
            array.append(i)
        }
        println("append \(n) elements \(NSDate().timeIntervalSinceDate(timer))")
        for i in 0 ..< n {
            var p: Int = Int(arc4random_uniform(UInt32(array.count - i))) + i
            array[i] = array[p]
        }
        println("permutation \(array.count) elements \(NSDate().timeIntervalSinceDate(timer))")
    }
}
// append 10000 elements 0.0645599961280823
// permutation 10000 elements 4.61092203855515

我是斯威夫特的新手。但我想我熟悉其他编程语言,如C ++,Java,Python。这种行为对我来说真的很奇怪。我错过了什么吗?

非常感谢你的帮助。产品:&gt;

  

顺便说一下,我的XCode版本是6.1 6A1052D,模拟器是iPad。我使用调试模式来测试我的代码。但即使在发布模式下,第二个代码仍比第一个慢得多。好难过。 ;&LT;

1 个答案:

答案 0 :(得分:2)

有趣的是,如果您更换,结果会发生显着变化:

for i in 0 ..< n {
    let p = Int(arc4random_uniform(UInt32(array.count - i))) + i
    array[i] = array[p]
}

for i in 0 ..< n {
    let p = Int(arc4random_uniform(UInt32(array.count - i))) + i
    let tmp = array[p]
    array[i] = tmp
}