测量在 Xcode 中渲染 UIView 的 CPU 使用率

Posted

技术标签:

【中文标题】测量在 Xcode 中渲染 UIView 的 CPU 使用率【英文标题】:Measuring CPU usage rendering a UIView in Xcode 【发布时间】:2018-12-01 06:28:33 【问题描述】:

我对 Interface Builder 中的 nib 有一个看法。它在笔尖中有几个UIStackViews,我使用它是因为它很容易对齐 UI 元素。一位同事建议我不要使用UIStackViews,因为从计算的角度来看它们“昂贵”。另一种方法是手动为单个元素设置约束。

我可以使用什么 Xcode 工具来验证我同事的断言,我将如何使用它?我发现的最好的东西是this,但我希望得到更细化的东西。有问题的笔尖是UITableViewCell

【问题讨论】:

不是您的问题的答案,但是,您的同事是惊人的、惊人的、令人惊讶的错误:) @Fattie 我与之交谈的不同人对此有不同的看法。我希望找到一种工具,可以客观地告诉我谁对谁错。 无论如何,我想知道这个工具。关于性能,所涉及的少数基本数学计算完全无关紧要。 (如果有人对此给出“不同意见”,他们无法估计 7 个数量级内的事物 :) :))再次是的,这是一个很好的问题,希望有人能给出一个很好的答案! 滚动时只需检查 Xcode 中的 FPS 仪表。如果您的 60 fps 流畅,则不必担心。如果不是,您需要使用仪器深入挖掘导致滞后的原因。甚至可能不是自动布局。 @Fattie 得到了我的答案。我对此也不满意:) 【参考方案1】:

从计算的角度来看,它们“昂贵”

好的,我现在将尝试证明这完全是假的。

堆栈视图并不神奇。堆栈视图不执行任何特殊的运行时调整。堆栈视图只是一个约束制造者,不多也不少。你也是。堆栈视图所做的一切,您都可以做到。堆栈视图的结果约束与您自己创建的约束完全相同(假设您甚至知道如何创建)。因此,约束本身并不昂贵,只是因为堆栈视图制造了它们。

那么让我们来谈谈约束的初始生成。好吧,堆栈视图通过死记硬背生成其约束。这只是一种简单的公式化方法,它基于堆栈视图的设置和(在某些情况下)排列的子视图的固有内容大小等已经给出的参数。所以实际上根本不需要时间堆栈视图吐出它生成的约束,它只需要做一次。

那么,如果约束的生成不昂贵,并且如果约束本身不昂贵,那么费用在哪里?哪里都没有。

有人可能会争辩说,对于特定期望的结果,使用堆栈视图是不必要的复杂或懒惰,因此自己制定约束会“更好”;但在我看来,“昂贵”似乎并不是可以针对堆栈视图提出的真正指控。

【讨论】:

谢谢你,马特。在 28:08 时观看2018 WWDC video 时,Apple 的代表说他们正在开发一种测量自动布局性能的工具,她展示了它的非公开版本。到今天为止,我还没有在 Instruments 中看到它 :( 感谢您对这个主题的见解。 是的,很多 WWDC 都是有抱负的。该工具从未实现。但你不需要它。您拥有查看堆栈视图创建的约束的工具,它们与您创建的相同,那么费用在哪里? 有很多基准测试表明堆栈视图比手动创建的约束要慢。我现在找不到它们,所以也许不再是这种情况了。从来没有调查过这个,因为这对我来说从来都不是问题。我唯一的猜测是堆栈视图创建的约束比手动创建的要多。 @Sven 如果你能把它们挖出来,我很乐意看到它们。目前,我倾向于加入马特的阵营。当堆栈可以在很短的时间内为您完成这些约束时,手动创建约束只需要很少的精力并且几乎完美的结果对我来说几乎就像“与编译器作斗争”。【参考方案2】:

在挖掘过程中,我发现了一个名为 LayoutFrameworkBenchmark 的 repo。我在 iPhone 7+ 模拟器上运行 ios 12 中的基准测试。我收集了数据并将其转储到 Google 表格中。它确实表明UIStackView 与其他布局方法相比是笨拙的。

我现在明白为什么两个阵营中似乎都有人,但在现实世界中,除非是一个庞大的集合,否则人眼不太可能注意到差异。

【讨论】:

嗯,好像和“autolayout”一样(但是..一切都是autolayout?)我其实不知道左边的其他条目是什么?? :O @Fattie 我也有同样的问题。大多数(如果不是全部)都在 GitHub 上。我喜欢 PinLayout。

以上是关于测量在 Xcode 中渲染 UIView 的 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

UIView重新渲染布局时,不会触发draw函数

Xcode 8.3.2 游乐场实时视图渲染不起作用

Xcode - IB Designable:无法渲染和更新自动布局(找不到合适的图像)

UIView 内的 StackView - 自动高度

NSInternalInconsistencyException Performance Metrics 在 Xcode 中测量性能时必须提供 10 次测量

在 Xcode 单元测试中测量期望时间