Подтвердить что ты не робот

Как оценивать выполнение Swift-кода?

Есть ли способ/программное обеспечение, чтобы дать точное время, необходимое для выполнения блока кода, написанного в Swift, кроме следующего?

let date_start = NSDate()

// Code to be executed 

println("\(-date_start.timeIntervalSinceNow)")
4b9b3361

Ответ 1

Если вы хотите получить представление о производительности определенного блока кода и убедиться, что производительность не повредит при редактировании, лучше всего использовать блок измерения в XCTest.

напишите unit test, который выполняет метод, который вы хотите проверить, и что unit test будет запускать его несколько раз, предоставляя необходимое время и отклонение результатов

func testExample() {

    self.measureBlock() {
        //do something you want to measure
    }
}

Дополнительную информацию можно найти в яблочных документах в разделе Тестирование с помощью Xcode → Тестирование производительности

Ответ 2

Если вам нужна отдельная функция синхронизации для блока кода, я использую следующие вспомогательные функции 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. Даже это может измениться на основе бета-версии.

Ответ 3

Вы можете использовать эту функцию для измерения асинхронного, а также синхронного кода:

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, хотя я не знаю, как именно это реализовано там.