什么是性能?

#

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

在此语境下,性能并非指动作本身的执行,而是指某物或某人表现的“好坏”程度。因此,我们使用形容词 高效的(performant)。

尽管“好坏”程度通常可以用自然语言描述,但在我们有限的范围内,重点是可量化为实数的事物。实数包括整数和 0/1 二进制数作为特例。自然语言描述仍然非常重要。例如,一篇仅凭文字而非任何数字(可量化值)就严厉批评 Flutter 性能的新闻文章仍然可能具有意义,并可能产生巨大影响。之所以选择有限的范围,仅仅是因为我们资源有限。

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

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

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

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

拓宽范围也允许将传统上容易被忽视的执行者纳入其中。文档性能就是一个例子。执行者可以是 SDK 的 API 文档,而指标可以是:认为 API 文档有用的读者百分比。

为什么性能很重要?

#

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

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

  1. 性能报告易于理解。
  2. 性能几乎没有歧义。
  3. 性能可比较且可转换。
  4. 性能是公平的。

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

1. 性能报告易于理解

#

性能指标是数字。阅读数字比阅读一段文字要容易得多。例如,工程师可能只需1秒钟就能将1到5的性能评分数字理解。而同一位工程师阅读完整的500字反馈摘要可能至少需要1分钟。

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

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

2. 性能几乎没有歧义

#

将性能作为一组数字的另一个优点是其明确性。当您希望动画达到每帧 20 毫秒或 50 fps 的性能时,这些数字几乎没有不同的解释空间。另一方面,如果用文字描述同一个动画,有些人可能会说它好,而另一些人可能会抱怨它差。同样,同一个词或短语可能被不同的人有不同的解读。您可能认为“可以接受的”帧率是 60 fps,而其他人可能认为是 30 fps。

数字仍然可能存在噪音。例如,测得的每帧时间可能是该帧的真实计算时间,加上 CPU/GPU 在一些不相关工作上花费的随机时间(噪音)。因此,指标会波动。尽管如此,数字的含义没有歧义。而且,也有严谨的理论和测试工具来处理这种噪音。例如,您可以进行多次测量来估计随机变量的分布,或者通过 大数定律 取多次测量的平均值来消除噪音。

3. 性能可比较且可转换

#

性能数字不仅含义明确,而且比较也明确。例如,毫无疑问 5 大于 4。另一方面,要判断“优秀”(excellent)是否比“卓越”(superb)更好或更差可能带有主观性。同样,你能判断“史诗”(epic)是否比“传奇”(legendary)更好吗?实际上,在某些人的解释中,短语 远远超出预期(strongly exceeds expectations)可能比 卓越(superb)更好。只有在定义将“远远超出预期”映射到 4,“卓越”映射到 5 之后,它们才变得明确且可比较。

数字也易于使用公式和函数进行转换。例如,60 fps 可以转换为每帧 16.67 毫秒。一帧的渲染时间 x(毫秒)可以转换为二元指标 isSmooth = [x <= 16] = (x <= 16 ? 1 :0)。这种转换可以复合或链式进行,因此您可以通过一次测量获得各种各样的量,而不会增加任何噪音或歧义。然后,转换后的量可以用于进一步的比较和使用。如果您处理的是自然语言,这种转换几乎是不可能的。

4. 性能是公平的

#

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

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

如何使性能变得有用

#

以下从略微不同的角度总结了这里讨论的四点:

  1. 使性能指标易于理解。不要用大量的数字(或文字)压倒读者。如果数字很多,尝试将它们总结成一小组数字(例如,将许多数字总结成一个平均值)。仅在数字发生显著变化时通知读者(例如,在峰值或回归时自动警报)。

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

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

  4. 使性能指标尽可能广泛地监测用户群体,不遗漏任何一人。