问题描述
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 (将#修改为@)