如何进行十次以上的性能测试?

时间:2016-07-30 08:55:44

标签: ios swift xcode performance-testing xctest

默认情况下,Xcodes性能测试运行十次,结果是十次测试的平均值。问题是每次运行时平均结果差别很大,所以我必须运行测试至少五次以获得收敛结果。这既乏味又耗时;有没有办法配置XCode或单元测试本身运行十次以上?

enter image description here

4 个答案:

答案 0 :(得分:8)

XCTestCase的类转储公开了这个方法:

- (void)_recordValues:(id)arg1 forPerformanceMetricID:(id)arg2 name:(id)arg3 unitsOfMeasurement:(id)arg4 baselineName:(id)arg5 baselineAverage:(id)arg6 maxPercentRegression:(id)arg7 maxPercentRelativeStandardDeviation:(id)arg8 maxRegression:(id)arg9 maxStandardDeviation:(id)arg10 file:(id)arg11 line:(unsigned long long)arg12;

当这个方法被淘汰时,第一个参数(arg1)有10个持续时间:

["0.003544568",
"0.003456569",
"0.003198263",
"0.003257955",
"0.003508724",
"0.003454298",
"0.003461192",
"0.00423787",
"0.003359195",
"0.003335757"]

我将4个新值(1.0,2.0,3.0,4.0)添加到此列表的末尾,然后再将其传递回原始实现,但不幸的是,另一个观察到的类XCTestLog具有内部理智检查是否被绊倒:

Assertion failure in +[XCTestLog _messageForTest:didMeasureValues:forPerformanceMetricID:name:unitsOfMeasurement:baselineName:baselineAverage:maxPercentRegression:maxPercentRelativeStandardDeviation:maxRegression:maxStandardDeviation:file:line:]
caught "NSInternalInconsistencyException", "Performance Metrics must provide 10 measurements." 

一旦XCTestLog方法也被覆盖,因此它没有断言,可以添加额外的4个值而不会有任何抱怨。不幸的是,视图仍然只显示了10个结果。

然而,

会更新迷你视图中的总时间+标准差值。

在Swizzling之前

Before Swizzle

在Swizzling之后添加4个值 After Swizzle

为了查看超过10个结果,可能需要调整XCode运行时以告诉表显示更多项。

答案 1 :(得分:4)

简短回答:不,没有暴露当前界面允许测量块超过十次。

答案越长:否,但是有一个界面可以修改度量块的某些指标。默认度量标准位于从defaultPerformanceMetrics返回的String数组中。现在似乎只支持一个指标:XCTPerformanceMetric_WallClockTime。这仅指定一个性能指标,该指标记录调用性能测试的startMeasuring()stopMeasuring()方法之间的时间(以秒为单位),而不是块运行的次数。

答案 2 :(得分:3)

在最新的Xcode(11.0+)中,您无需费力即可更改迭代次数。使用以下function

func measure(options: XCTMeasureOptions, block: () -> Void)

这将允许您指定具有iterationCount属性的XCTMeasureOptions

文档中的有趣注释:

性能测试iterationCount+1次运行其块,忽略了第一次迭代并记录了其余迭代的指标。该测试忽略了第一次迭代,以减少与“预热”缓存和其他首次运行行为相关的测量差异。

答案 3 :(得分:1)

我通常将“标准偏差”值扩展为包含我要接受的范围。

一个明显的解决方法是在要执行的测量块内执行5次操作。 (您需要更改预期时间。)

    measure {
        for _ in [1...5] {
            // ...
        }
    }