为什么for-in比swift调试模式下的慢?
为什么 for-in 比 swift 调试模式下的慢?如果您认为,是的,它是在没有优化的情况下运行的。
??下面的代码,时间是for-in和没有优化的比较
49999995000000 for-in -- 时间 = 3.3352
4999999950000000 而 -- 时间 = 0.3613
??但是,如果使用速度优化
49999995000000 for-in -- 时间 = 0.0037
49999995000000 而 -- 时间 = 0.0035
我想知道“为什么 for-in 比没有优化的时候慢?为什么优化中的 for-in 和 while 这么快?”
import Foundation
func processTime(_ title: String, blockFunction: () -> ()) {
print()
let startTime = CFAbsoluteTimeGetCurrent()
blockFunction()
let processTime = CFAbsoluteTimeGetCurrent() - startTime
print(title, " -- time = (String(format : "%.4f",processTime))")
}
processTime("for-in") {
var sum = 0
for i in 0..<10000000 {
sum += i
}
print(sum)
}
processTime("while") {
var sum = 0
var i = 0
while i<10000000 {
sum += i
i += 1
}
print(sum)
}
回答
从 Swift 的角度来看,你的for循环实际上转化为这样的:
let range = 0..<10000000
var iterator = range.makeIterator()
while let next = iterator.next() {
...
}
请注意,next对范围的迭代器有很多调用,它有自己的状态需要跟踪,并IndexingIterator.next调用一堆协议方法,调度这也需要一些时间,因为它必须查找见证表。确切地看到这里Iterator.next将进行什么调用。
如果您处于调试模式,则不会优化所有这些。
将其与您的 while 循环进行比较,该循环基本上将某些内容设置为 0,进行比较,在循环中执行此操作,为其加 1,然后重复。显然,这比调用所有这些方法要简单得多。
但是,如果您启用优化,编译器可以看到 for 循环正在执行 while 循环所做的任何事情。
因为我觉得它很有趣,所以我做了一个循环的一些时间配置文件,例如:
var s = ""
for i in 0...10000000 {
s += "(i)"
}
80%的时间都花在了next(),看看它做了多少事情!我的屏幕截图甚至无法包含所有内容。字符串连接只占大约 6%(不在截图中)。