为什么第一次运行“XCTestCase -measureBlock:”需要这么长时间?

6

我正在使用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 值: [0.000007, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001] 这是一个错误吗?发生了什么?
3个回答

3

这可能是一些缓存预热的结果。

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

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


2
谢谢。我尝试过了,但还是得到相同的模式。第一次运行仍然需要很长时间。:( - Hlung

2

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


0

可能的原因是Xcode在首次调用measure时需要符号化您的二进制文件,以便检测您所处的测试。至少这是Swift论坛上的帖子所暗示的;这种潜在的减速可能也适用于ObjC项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接