在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;
答案 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
}