Как создать функцию, которая измеряет время выполнения алгоритмов? - PullRequest
0 голосов
/ 03 марта 2019

Если я хочу оценить временную производительность нескольких алгоритмов, используя Date() или Dispatch(), как я могу создать функцию, которая делает это?

Например, этот алгоритм двоичного поиска.Как я могу передать его в качестве параметра замыкания и сделать так, чтобы замыкание выполняло все измерения производительности времени, используя любой из методов сохранения времени Swift, приведенных ниже?Пожалуйста, ответьте с примером закрытия.Благодарю.

let startingPoint = Date()
let startingPoint = Dispatch().now


    func binarySearchForValue(searchValue: Int, array: [Int]) -> Bool {

    var leftIndex = 0
    var rightIndex = array.count - 1

    while leftIndex <= rightIndex {

        let middleIndex = (leftIndex + rightIndex) / 2
        let middleValue = array[middleIndex]

    if middleValue == searchValue {
        return true
    }

    if searchValue < middleValue {
        rightIndex = middleIndex - 1
    }

        if searchValue > middleValue {
            leftIndex = middleIndex + 1
        }
    }
    return false
}

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Поскольку вам может потребоваться измерить разные функции, вероятно, имеет смысл захватывать аргументы для функции в замыкании, а не включать их типы в сигнатуру.Но я использовал универсальный тип для возвращаемого значения.Я надеюсь, что это то, что вам нужно:

func measure<R>(_ label: String, operation: () -> R) -> R {
  let start = DispatchTime.now()
  let result = operation()
  let end = DispatchTime.now()
  let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
  let timeInterval = Double(nanoTime) / 1_000_000_000
  print(String(format: "%@: %.9f s", label, timeInterval))
  return result
}

Вот как вы его используете:

let result = measure("search") { binarySearchForValue(searchValue: 3, array: [1, 3, 8]) }
print(result) // that's the result of the function that was measured, not the measurement

measure("some function") { functionWithoutReturnValue() }

Если функция не имеет возвращаемого значения, R будет (), так что это должно работать тоже.Просто не присваивайте результат чему-либо (см. Пример выше).Если вы хотите сделать что-то с измерением, отличным от его печати на консоли, вы можете сделать это тоже.Но вы не указали это в своем вопросе, поэтому я пошел с print.

0 голосов
/ 04 марта 2019

Вы должны использовать XCTest для измерения производительности ... Он дает вам правильную статистику для вашего метода с точки зрения производительности

т.е.

func testMyCodesPerformance() {
    measureBlock {
        someClass.doSomethingFancy()
    }
}

enter image description here

Вы можете сделать гораздо больше, используя XCTest measureBlock для тестирования производительности

0 голосов
/ 03 марта 2019

Не уверен, что именно вы здесь, и это решение ниже будет соответствовать только одной определенной сигнатуре функции для проверки

func testBench(search: Int, array: [Int], testCase test: (Int, [Int]) -> Bool) {
    let start = DispatchTime.now()
    test(search, array)
    let end = DispatchTime.now()

    print("\(start) - \(end)")
}

, которая называется так

testBench(search: 3, array: [6,7,5,3]) {binarySearchForValue(searchValue: $0, array: $1)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...