为什么第一次运行“XCTestCase -measureBlock:”会花费这么多时间?

时间:2015-09-25 05:02:00

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

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

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

事实证明,首次运行的时间总是非常高,比如高出400-500%。对于一个非常简单的方法也是如此,甚至在度量块中也没有。我的- (void)setUp- (void)tearDown中没有任何内容。

NSString -stringWithFormat:的结果。在图表的第一个条形图中查看尖峰。 enter image description here values: [0.000031, 0.000005, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003]

空白区块的结果。类似的结果。 enter image description here values: [0.000007, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001]

这是一个错误还是什么?发生了什么事?

2 个答案:

答案 0 :(得分:3)

这可能是某些缓存升温的神器。

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

您可以在调用measureBlock:之前放置测量块的内容,以测试是否为真。因此,热身运行就不会被测量了。

答案 1 :(得分:2)

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