例如,如果我有这样的代码
for i in 1 ... 10000 {
let someValue = 9
...
}
我应该把let值放在循环之外,这样我就可以获得更好的性能,还是完全没有必要?
autoreleasepool {
let someValue = 9
for i in 1 ... 10000 {
...
}
}
有什么想法吗?
对于可以很快初始化的类型,您可能不需要使用第二个版本,因为这只会带来较小的性能改进。
编译器也可以对其进行优化。特别是在structs
和enums
的情况下,因为它们根本不能突变。尽管使用类可以更改其内容,如果编译器无法在编译时检查其是否发生了更改,则无法对其进行优化。
总而言之,对于Int
这样一个简单的情况,使用哪一个取决于您,因为假设您在for循环中做了一些繁重的工作(而不仅仅是初始化Int
),几乎不会提高性能。
注:对于不同的作用域,Swift 2引入了do {}
:
do {
let someValue = 9
for i in 1 ... 10000 {
...
}
}
外部
let a = NSDate()
for i in 1...100 {
let someValue = a
print("Hello World!")
}
let b = NSDate()
let c: Double = b.timeIntervalSinceDate(a)
print(c)
let d = NSDate()
let someValue = a
for i in 1...100 {
print("Hello World!")
}
let e = NSDate()
let f: Double = e.timeIntervalSinceDate(d)
print(f)
在操场上运行最新版本OSX的MacBook Airc=0.092和f=0.022
看来你需要重新写这个问题。如果常数不会发生突变,那么它应该在循环之外。循环用于需要变异的重复代码。外部总是更好的,因为内部必须分配另一个实例i次,而不是一次。