如何基准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?