如果我想使用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
}
答案 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()
}
}
使用XCTest measureBlock进行性能测试,您可以做更多的事情