You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:23:14