【问题标题】:Why does the first run of "XCTestCase -measureBlock:" takes so much time?为什么“XCTestCase -measureBlock:”的第一次运行需要这么多时间?
【发布时间】:2015-12-22 20:53:21
【问题描述】:

我正在使用 Xcode 7。iPhone 5s 模拟器 (iOS 9.0)。

我正在尝试使用XCTestCase -measureBlock: 来衡量花费在我的某些功能上的时间。这会将代码块内的代码运行 10 次,并报告每次运行所需的时间、平均值、STDEV 等结果。

事实证明,第一次运行的时间总是很长,比如高出 400-500%。 一个非常简单的方法也会发生同样的情况,甚至在测量块中什么也不做。我的- (void)setUp 或- (void)tearDown 中没有任何内容。

NSString -stringWithFormat: 的结果。查看图表第一条的尖峰。 values: [0.000031, 0.000005, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003]

空白块的结果。类似的结果。 values: [0.000007, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001]

这是一个错误还是什么?怎么回事?

【问题讨论】:

    标签: objective-c xcode unit-testing performance-testing xctest


    【解决方案1】:

    这可能是一些缓存预热的产物。

    例如,Objective-C 运行时为每个类维护一个选择器缓存。这意味着对每个方法的第一次调用比随后的调用要慢一些。

    您可以在调用measureBlock: 之前将测量块的内容放在前面,以测试这是否正确。因此,热身跑就不会被测量。

    【讨论】:

    • 谢谢。我试过了,但仍然得到相同的模式。第一次运行仍然需要很多时间。 :(
    【解决方案2】:

    测量的块执行十次,测试输出显示平均执行时间以及单个运行时间和标准偏差 (http://nshipster.com/xctestcase/) 因此,第一次它可以填充缓存并准备数据,如果您的代码这样做了,那么在接下来的步骤中,它可能会处理缓存的数据,并且执行时间也可以更短。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      相关资源
      最近更新 更多