Есть ли способ/программное обеспечение, чтобы дать точное время, необходимое для выполнения блока кода, написанного в Swift, кроме следующего?
let date_start = NSDate()
// Code to be executed
println("\(-date_start.timeIntervalSinceNow)")
Есть ли способ/программное обеспечение, чтобы дать точное время, необходимое для выполнения блока кода, написанного в Swift, кроме следующего?
let date_start = NSDate()
// Code to be executed
println("\(-date_start.timeIntervalSinceNow)")
Если вы хотите получить представление о производительности определенного блока кода и убедиться, что производительность не повредит при редактировании, лучше всего использовать блок измерения в XCTest.
напишите unit test, который выполняет метод, который вы хотите проверить, и что unit test будет запускать его несколько раз, предоставляя необходимое время и отклонение результатов
func testExample() {
self.measureBlock() {
//do something you want to measure
}
}
Дополнительную информацию можно найти в яблочных документах в разделе Тестирование с помощью Xcode → Тестирование производительности
Если вам нужна отдельная функция синхронизации для блока кода, я использую следующие вспомогательные функции Swift:
func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
let startTime = CFAbsoluteTimeGetCurrent()
operation()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
println("Time elapsed for \(title): \(timeElapsed) s.")
}
func timeElapsedInSecondsWhenRunningCode(operation: ()->()) -> Double {
let startTime = CFAbsoluteTimeGetCurrent()
operation()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
return Double(timeElapsed)
}
Первый будет выходить из времени, требуемого для данного раздела кода, причем последний возвращает это как float. В качестве примера первого варианта:
printTimeElapsedWhenRunningCode(title:"map()") {
let resultArray1 = randoms.map { pow(sin(CGFloat($0)), 10.0) }
}
выйдет что-то вроде:
Время, прошедшее для карты(): 0.0617449879646301 s
Помните, что Тесты Swift будут сильно различаться в зависимости от выбранного вами уровня оптимизации, поэтому это может быть полезно только для относительных сравнений времени выполнения Swift. Даже это может измениться на основе бета-версии.
Вы можете использовать эту функцию для измерения асинхронного, а также синхронного кода:
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()
// ...
}
Это должно быть похоже на measureBlock из XCTest, хотя я не знаю, как именно это реализовано там.