如何创建一个衡量算法时间性能的函数?

时间:2019-03-03 05:29:38

标签: swift

如果我想使用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 :(得分:1)

不确定在此之后您到底要做什么,下面的解决方案仅适合一个特定的功能签名进行测试

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)}

答案 1 :(得分:1)

由于您可能要测量不同的函数,因此在闭包中捕获函数的参数而不是在签名中包括它们的类型可能很有意义。但是我确实使用通用类型作为返回值。我希望这是您所追求的:

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

答案 2 :(得分:1)

您应该使用XCTest来衡量性能……就性能而言,它可以为您的方法提供适当的统计信息

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

enter image description here

使用XCTest measureBlock进行性能测试,您可以做更多的事情