这很烦人。
尽管在 Xcode 11 中,您可以指定XCTMeasureOptions
何时调用self.measure { }
,即measure(options: XCTMeasureOptions, block: () -> Void)
. 在 中options
,您可以设置iterationCount
为 1。
但!
iterationCount
根据以下文档,设置为 1,Xcode 实际上会运行两次测量块iterationCount
:
性能测试运行其块迭代Count+1 次,忽略第一次迭代并记录剩余迭代的指标。该测试忽略第一次迭代以减少与“预热”缓存和其他首次运行行为相关的测量方差。
它在实践中确实运行了两次。
同时iterationCount
根据文档设置为 0 不会产生任何结果:
... iterationCount+1 次,忽略第一次迭代并记录剩余迭代的指标
我不知道更改测量计数的Runtime Swizzling 方式是否可以摆脱热身运行。
解决方法
设置一个计数器以...
- 跳过第一次运行:
func testYourFunction() {
let option = XCTMeasureOptions()
option.iterationCount = 1
var count = 0
self.measure(options: option) {
if count == 0 {
count += 1
return
}
// Your test code...
}
}
- 回滚更改:
func testYourFunction() {
let option = XCTMeasureOptions()
option.iterationCount = 1
var count = 0
self.measure(options: option) {
defer {
if count == 0 {
try? setUpWithError()
// call `setUpWithError` manually
// or run your custom rollback logic
}
count += 1
}
// Your test code...
}