使用XCTClockMetric的reportMeasurements返回空报告,如何获取性能指标?
问题:XCTest中调用reportMeasurements返回空数组,如何获取代码执行时间平均值?
原测试代码
final class SutTest: XCTestCase { var sut: Sut! override func setUp() { super.setUp() sut = Sut() } override func tearDown() { sut = nil super.tearDown() } func testExample() { let clockMetric = XCTClockMetric() let start = XCTPerformanceMeasurementTimestamp() measure(metrics: [clockMetric]) { sut.testing() } let end = XCTPerformanceMeasurementTimestamp() let array = try! clockMetric.reportMeasurements(from: start, to: end) array.count // array is empty } }
问题描述
我尝试通过reportMeasurements方法提取性能指标信息,但调用后返回空数组。我希望在代码中访问XCTest在Xcode中展示的性能报告,获取代码段的执行时间平均值,请问如何在代码中获取这些指标信息?
解决方案
你遇到空数组的原因是:手动创建的XCTPerformanceMeasurementTimestamp和measure方法内部实际记录的测量时间戳不匹配,导致reportMeasurements无法找到对应的数据。
以下是两种可行的解决方式:
方式1:使用Metric自身的时间戳属性
直接利用XCTClockMetric自动记录的startTimestamp和endTimestamp来获取测量结果:
func testExample() { let clockMetric = XCTClockMetric() measure(metrics: [clockMetric]) { sut.testing() } do { // 使用metric自身的起止时间戳 let measurements = try clockMetric.reportMeasurements( from: clockMetric.startTimestamp, to: clockMetric.endTimestamp ) // 计算平均执行时间 let totalDuration = measurements.map { $0.duration }.reduce(0.0, +) let averageDuration = totalDuration / Double(measurements.count) print("平均执行时间:\(averageDuration) 秒") } catch { print("获取性能数据失败:\(error.localizedDescription)") } }
方式2:通过measure的Completion Handler获取
利用measure方法的完成回调,直接获取所有测量后的Metric数据:
func testExample() { let clockMetric = XCTClockMetric() measure(metrics: [clockMetric]) { sut.testing() } completionHandler: { metrics in // 遍历回调返回的metrics,找到目标XCTClockMetric guard let targetMetric = metrics.first as? XCTClockMetric else { return } do { let measurements = try targetMetric.reportMeasurements( from: targetMetric.startTimestamp, to: targetMetric.endTimestamp ) let averageDuration = measurements.map { $0.duration }.reduce(0.0, +) / Double(measurements.count) print("平均执行时间:\(averageDuration) 秒") } catch { print("获取性能数据失败:\(error.localizedDescription)") } } }
说明
两种方式都能获取到和Xcode性能报告一致的测量数据,其中duration属性的单位是秒,直接计算平均值即可得到代码段的平均执行时间。
内容的提问来源于stack exchange,提问作者errorka
相关产品推荐
相关产品推荐

