swift - 为什么 for-in 比在快速调试模式下慢?
问题描述
为什么 for-in 比在快速调试模式下慢?如果您认为,是的,它是在没有优化的情况下运行的。
⬇️下面的代码,Time 是比较 for-in 和 while in 没有优化
49999995000000 - 时间 = 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% 左右(截图中没有)。
推荐阅读
- javascript - 回调函数理解和返回语句
- postgresql - Go SQLX sqlx.DB Get("sql_function") 不返回任何值
- python - 每次循环时将循环中收集的数据输出到文件 - Python
- python - pandas dataframe datetime - 将字符串转换为日期时间偏移量
- java - java中的“.next”和“.next()”有什么区别?
- html - Captive Network Assistant 浏览器 - 视频无法在 iPad、iPhone 设备上播放
- touch - AutoHotkey - 如何注入多点触控(单点触控工作)
- python - 要移动 netcdf4 文件的日期,请尝试使用 time=time.shift(1,freq='D')。它显示一个错误,请问我该如何处理?
- node.js - jwt身份验证节点js在本地工作但不在远程(heroku)上工作
- python - 如何使图例项目在情节中加粗