跳至主要内容

关于性能的更多思考

什么是性能?

#

性能是一组执行者的可量化属性。

在此上下文中,性能本身并不是执行操作;而是指某事物或某人执行得有多好。因此,我们使用形容词“高性能”。

虽然“好坏程度”通常可以用自然语言描述,但在我们有限的范围内,重点关注的是可以量化为实数的东西。实数包括整数和 0/1 二进制作为特例。自然语言描述仍然非常重要。例如,一篇新闻文章仅仅使用文字(没有任何数字,即可量化的值)来强烈批评 Flutter 的性能,仍然可能是有意义的,并且可能产生巨大的影响。选择有限的范围仅仅是因为我们的资源有限。

描述性能所需的量通常被称为指标。

为了在无数的性能问题和指标中进行导航,您可以根据执行者进行分类。

例如,本网站上的大部分内容都与 Flutter 应用性能有关,其中执行者是 Flutter 应用。基础设施性能对于 Flutter 也很重要,其中执行者是构建机器人和 CI 任务运行器:它们极大地影响了 Flutter 整合代码更改的速度,从而提高应用的性能。

这里,范围有意扩大到包括除应用性能问题之外的其他性能问题,因为无论执行者是谁,它们都可以共享许多工具。例如,Flutter 应用性能和基础设施性能可能共享相同的仪表板和类似的警报机制。

扩大范围还可以包括传统上容易被忽略的执行者。文档性能就是一个例子。执行者可以是 SDK 的 API 文档,指标可以是:阅读者发现 API 文档有用的百分比。

为什么性能很重要?

#

回答这个问题不仅对于验证性能方面的工作至关重要,而且对于指导性能工作以使其更有用也很重要。“为什么性能很重要?”的答案通常也是“性能如何有用?”的答案。

简单来说,性能之所以重要且有用,是因为在该范围内,性能必须具有可量化的属性或指标。这意味着

  1. 性能报告易于理解。
  2. 性能歧义性小。
  3. 性能具有可比性和可转换性。
  4. 性能是公平的。

这并不是说非性能问题或不可衡量的 问题或描述不重要。它们旨在突出性能可以发挥更大作用的场景。

1. 性能报告易于理解

#

性能指标是数字。阅读数字比阅读一段文字容易得多。例如,工程师可能需要 1 秒钟的时间来理解 1 到 5 的性能评分。同样的工程师可能需要至少 1 分钟才能阅读完整的 500 字反馈总结。

如果有许多数字,则可以轻松地对其进行汇总或可视化以快速理解。例如,您可以通过查看直方图、平均值、分位数等,快速理解数百万个数字。如果某个指标的历史数据点有数千个,那么您可以轻松地绘制时间线以读取其趋势。

另一方面,拥有 n 个 500 字的文本几乎保证了需要花费 n 倍的时间来理解这些文本。分析数千个历史描述(每个描述有 500 个字)将是一项艰巨的任务。

2. 性能几乎没有歧义

#

将性能作为一组数字的另一个优势在于其明确性。当您希望动画每帧的性能为 20 毫秒或 50 帧/秒时,对这些数字的不同解释的空间很小。另一方面,用文字来描述相同的动画,有人可能会称之为好,而另一些人则可能会抱怨它不好。同样,不同的个人可能会对相同的词语或短语有不同的理解。您可能会将良好的帧率理解为 60 帧/秒,而其他人则可能会将其理解为 30 帧/秒。

数字仍然可能存在噪声。例如,测量的每帧时间可能是此帧的真实计算时间,加上 CPU/GPU 用于某些无关工作的随机时间量(噪声)。因此,指标会波动。但是,数字的含义没有歧义。此外,还有一些严格的理论和测试工具来处理此类噪声。例如,您可以进行多次测量以估计随机变量的分布,或者可以对许多测量结果取平均值,以通过大数定律消除噪声。

3. 性能具有可比性和可转换性

#

性能数字不仅具有明确的含义,而且还具有明确的比较性。例如,毫无疑问 5 大于 4。另一方面,判断优秀是否优于卓越可能是主观的。同样,您能否判断史诗是否优于传奇?实际上,在某些人的理解中,“大大超出预期”可能比“卓越”更好。只有在将“大大超出预期”映射到 4 而将“卓越”映射到 5 的定义之后,它才会变得明确且可比较。

数字还可以使用公式和函数轻松转换。例如,60 帧/秒可以转换为每帧 16.67 毫秒。帧的渲染时间 x(毫秒)可以转换为二进制指示符 isSmooth = [x <= 16] = (x <= 16 ? 1 :0)。这种转换可以复合或链接,因此您可以使用单个测量获得各种各样的数量,而不会增加任何噪声或歧义。然后,转换后的数量可用于进一步比较和理解。如果您处理的是自然语言,则此类转换几乎是不可能的。

4. 性能是公平的

#

如果问题依赖于冗长的文字来发现,那么就会给那些更健谈(更愿意聊天或写作)或那些更靠近开发团队的人提供不公平的优势,这些人拥有更大的带宽和更低的聊天或面对面会议成本。

通过使用相同的指标来检测问题,无论用户距离多远或多沉默,我们都可以公平地对待所有问题。这反过来又使我们能够专注于对影响更大的正确问题。

如何使性能变得有用

#

以下是此处讨论的 4 个要点,从略微不同的角度进行总结

  1. 使性能指标易于理解。不要让读者被大量数字(或文字)淹没。如果有很多数字,则尝试将其汇总成更少的数字集(例如,将许多数字汇总成单个平均数)。仅在数字发生重大变化时通知读者(例如,对峰值或回归进行自动警报)。

  2. 使性能指标尽可能明确。定义数字使用的单位。精确描述如何测量数字。使数字易于复制。当存在大量噪声时,尝试显示完整的分布,或通过聚合许多噪声测量来尽可能消除噪声。

  3. 方便比较性能。例如,提供时间线以将当前版本与旧版本进行比较。提供将一个指标转换为另一个指标的方法和工具。例如,如果我们可以将内存增加和帧率下降都转换为用户流失数量或美元损失的收入,那么我们可以对其进行比较并做出明智的权衡。

  4. 使性能指标监控尽可能广泛的人群,这样就不会有人被落下。