如何基准Swift代码执行?

有没有一种方法/软件可以提供执行用Swift编写的代码块所需的精确时间,以下情况除外?

let date_start = NSDate()

// Code to be executed 

println("(-date_start.timeIntervalSinceNow)")

如果您想深入了解某个代码块的性能,并确保在编辑时性能不会受到影响,那么最好的办法就是使用XCTest的度量性能函数,如measure(_ block: () -> Void)

编写一个单元测试,执行你想要的基准测试方法,这个单元测试会多次运行它,给你所需的时间和结果的偏差

func testExample() {

    self.measure {
        //do something you want to measure
    }
}

你可以在Xcode测试 - >性能测试下的苹果文档中找到更多信息


如果您只想为代码块提供独立的计时功能,那么我使用以下Swift帮助器函数:

func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
    let startTime = CFAbsoluteTimeGetCurrent()
    operation()
    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
    print("Time elapsed for (title): (timeElapsed) s.")
}

func timeElapsedInSecondsWhenRunningCode(operation: ()->()) -> Double {
    let startTime = CFAbsoluteTimeGetCurrent()
    operation()
    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
    return Double(timeElapsed)
}

前者将注销给定代码段所需的时间,后者将其作为浮点数返回。 作为第一个变体的例子:

printTimeElapsedWhenRunningCode(title:"map()") {
    let resultArray1 = randoms.map { pow(sin(CGFloat($0)), 10.0) }
}

会注销如下内容:

map()耗用的时间:0.0617449879646301 s

请注意,根据您选择的优化级别,Swift基准测试会有很大差异,所以这可能只对Swift执行时间的相对比较有用。 即使这可能会按照beta版本进行更改。


你可以使用这个函数来测量异步和同步代码:

import Foundation

func measure(_ title: String, block: (() -> ()) -> ()) {

    let startTime = CFAbsoluteTimeGetCurrent()

    block {
        let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
        print("(title):: Time: (timeElapsed)")
    }
}

所以基本上你会传递一个接受函数作为参数的块,用来告诉度量何时完成。

例如,为了衡量一些叫做“myAsyncCall”的调用需要多长时间,你可以这样调用它:

measure("some title") { finish in
    myAsyncCall {
        finish()
    }
    // ...
}

对于同步代码:

measure("some title") { finish in
     // code to benchmark
     finish()
     // ...
}

这应该与XCTest中的measureBlock类似,但我不知道它在那里是如何实现的。

链接地址: http://www.djcxy.com/p/31669.html

上一篇: How to benchmark Swift code execution?

下一篇: Accessing direct memory address and can we access directly any memory address?