Benchmarking-Funktion - Swift 4.2
Dies ist eine unglaublich vielseitige Benchmarking-Funktion, die es ermöglicht, Tests zu kennzeichnen, viele Tests durchzuführen und ihre Ausführungszeiten zu mitteln. Dies ist ein Setup-Block, der zwischen den Tests aufgerufen wird (dh das Mischen eines Arrays zwischen dem Messen eines Sortieralgorithmus) und das klare Drucken des Benchmarking Ergebnisse, und es gibt auch die durchschnittliche Ausführungszeit als Double
.
Versuche Folgendes:
@_transparent @discardableResult public func measure(label: String? = nil, tests: Int = 1, printResults output: Bool = true, setup: @escaping () -> Void = { return }, _ block: @escaping () -> Void) -> Double {
guard tests > 0 else { fatalError("Number of tests must be greater than 0") }
var avgExecutionTime : CFAbsoluteTime = 0
for _ in 1...tests {
setup()
let start = CFAbsoluteTimeGetCurrent()
block()
let end = CFAbsoluteTimeGetCurrent()
avgExecutionTime += end - start
}
avgExecutionTime /= CFAbsoluteTime(tests)
if output {
let avgTimeStr = "\(avgExecutionTime)".replacingOccurrences(of: "e|E", with: " × 10^", options: .regularExpression, range: nil)
if let label = label {
print(label, "▿")
print("\tExecution time: \(avgTimeStr)s")
print("\tNumber of tests: \(tests)\n")
} else {
print("Execution time: \(avgTimeStr)s")
print("Number of tests: \(tests)\n")
}
}
return avgExecutionTime
}
Verwendung
var arr = Array(1...1000).shuffled()
measure(label: "Map to String") {
let _ = arr.map { String($0) }
}
measure(label: "Apple Shuffle", tests: 1000, setup: { arr.shuffle() }) {
arr.sort()
}
measure {
let _ = Int.random(in: 1...10000)
}
let mathExecutionTime = measure(printResults: false) {
let _ = 219 * 354
}
print("Math Execution Time: \(mathExecutionTime * 1000)ms")
Hinweis: measure
Gibt auch die Ausführungszeit zurück. Die label
, tests
und setup
Argumente sind optional. Das printResults
Argument ist true
standardmäßig eingestellt.