如何解决测量优化的 Swift 代码的运行时间
Swift 编译器可以通过简单地不执行程序的某些部分来优化它们,因为这些部分可能不会产生在其他地方使用的结果。除了在进行性能分析时,这几乎总是非常有用。在下面的代码中,目的是找到 sum() 函数的执行时间。
import Foundation
func timeit( body: () -> () ) -> UInt64 {
let t1 = dispatchTime.Now().uptimeNanoseconds
body()
let t2 = dispatchTime.Now().uptimeNanoseconds
return t2-t1
}
func sum<Number>(_ x: ContiguousArray<Number> ) -> Number where Number: Numeric {
var s = Number.zero
for k in 0..<x.count {
s += x[k]
}
return s
}
let x = ContiguousArray<Int>(1...1_000_000)
var z = 0
for k in 0..<5 {
print("\(k)th run:")
let t = timeit {
z = sum(x)
}
print("\t run time: \(t)")
print("\t sum: \(z)")
}
这会产生以下输出:
0th run:
run time: 744485
sum: 500000500000
1th run:
run time: 724117
sum: 500000500000
2th run:
run time: 673185
sum: 500000500000
3th run:
run time: 710229
sum: 500000500000
4th run:
run time: 784819
sum: 500000500000
但是,如果我简单地删除 z
,结果被分配到
for k in 0..<5 {
print("\(k)th run:")
let t = timeit {
sum(x)
}
print("\t run time: \(t)")
print("\t sum: \(z)")
}
然后产生以下输出:
0th run:
run time: 7404
sum: 0
1th run:
run time: 112
sum: 0
2th run:
run time: 27
sum: 0
3th run:
run time: 26
sum: 0
4th run:
run time: 26
sum: 0
您可以看到,除了第一次运行之外,运行时间都小于 120 纳秒。这些运行时间与上述运行时间约为 700,000 纳秒的情况截然不同。请注意,总和为零是因为从未捕获到结果 - 这里是需要的,因为我们对生成的结果不感兴趣,我们只想知道执行时间。
具有 -O 优化级别的“整体模块”模式是我的构建设置。当我选择具有 -Onone 优化级别的“增量”模式时,运行时间没有差异。但是,我们想知道优化代码的运行时间。
为了能够测量经过的时间,我们是否总是被迫从定时关闭中获取一些结果?我正在寻找一种不涉及捕获结果的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。