【问题标题】:How can I run my performance tests more than ten times?如何进行十次以上的性能测试?
【发布时间】:2016-12-04 22:57:46
【问题描述】:

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

【问题讨论】:

    标签: ios swift xcode performance-testing xctest


    【解决方案1】:

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

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

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

    来自文档的有趣注释:

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

    【讨论】:

      【解决方案2】:

      我通常会扩展标准偏差值以包含我接受的范围。

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

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

      【讨论】:

      • 这只迭代一次,因为[1...5] 只是一个包含单个元素的数组。
      【解决方案3】:

      简短的回答:不,没有公开的当前接口允许测量块超过十次。

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

      【讨论】:

      • 我们不能也减少它吗?
      【解决方案4】:

      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 并添加 4 个值后

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

      【讨论】:

      • 这个工作准确吗?对于三个新条目来说,从 0.003 秒增加到 0.717 秒似乎有点多。
      • 是的,这可以正常工作。原始 10 个值的平均值为 0.00348,14 个(添加 1、2、3、4)值的平均值为 0.71677
      • (0.003544568 + 0.003456569 + 0.003198263 + 0.003257955 + 0.003508724 + 0.003454298 + 0.003461192 + 0.00423787 + 0.003359195 + 0.003335757 + 1 + 2 + 3 + 4)/ 14 跨度>
      • 我强烈不推荐这种方法。一旦苹果更改了 XCTest 框架中的任何类,这一切都可能中断。
      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多