测量优化的 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 (将#修改为@)