我应该将 let 值放在 for 循环之外以获得更好的性能吗?
Should I put let values out of for loops to get better performance?
例如,如果我有这样的代码
for i in 1 ... 10000 {
let someValue = 9
...
}
我应该将 let 值放在循环之外,这样我可以获得更好的性能还是完全没有必要?
autoreleasepool {
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)
在操场上玩着 MacBook Air 运行 OSX 的最新版本
c = 0.092 和 f = 0.022
看来您需要改写问题。如果常量不会发生变化,那么它应该在循环之外。循环用于需要变异的重复代码。外面总是更好,因为在里面你必须分配另一个实例 i 次而不是一次。
对于可以快速初始化的类型,您可能不需要使用第二个版本,因为这只会带来较小的性能改进。
编译器也可以将其优化掉。特别是在 structs
和 enums
的情况下,因为它们根本无法改变。尽管使用 类 你可以改变它的内容,如果编译器不能在编译时检查它是否被改变,它就不能被优化。
总而言之,对于 Int
这种简单的情况,使用哪个取决于您,因为假设您做了一些繁重的工作(不仅仅是初始化 Int
) 在 for 循环中。
注意:针对不同的作用域 Swift 2 介绍 do {}
:
do {
let someValue = 9
for i in 1 ... 10000 {
...
}
}
例如,如果我有这样的代码
for i in 1 ... 10000 {
let someValue = 9
...
}
我应该将 let 值放在循环之外,这样我可以获得更好的性能还是完全没有必要?
autoreleasepool {
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)
在操场上玩着 MacBook Air 运行 OSX 的最新版本 c = 0.092 和 f = 0.022
看来您需要改写问题。如果常量不会发生变化,那么它应该在循环之外。循环用于需要变异的重复代码。外面总是更好,因为在里面你必须分配另一个实例 i 次而不是一次。
对于可以快速初始化的类型,您可能不需要使用第二个版本,因为这只会带来较小的性能改进。
编译器也可以将其优化掉。特别是在 structs
和 enums
的情况下,因为它们根本无法改变。尽管使用 类 你可以改变它的内容,如果编译器不能在编译时检查它是否被改变,它就不能被优化。
总而言之,对于 Int
这种简单的情况,使用哪个取决于您,因为假设您做了一些繁重的工作(不仅仅是初始化 Int
) 在 for 循环中。
注意:针对不同的作用域 Swift 2 介绍 do {}
:
do {
let someValue = 9
for i in 1 ... 10000 {
...
}
}