更多关于性能的想法
什么是性能?
性能是一组表演者的可量化属性。
在此上下文中,性能并不是动作本身的执行;而是某物或某人执行得如何。因此,我们使用形容词performant。
虽然执行得如何部分通常可以用自然语言描述,但在我们的有限范围内,重点在于可以量化为实数的内容。实数包括整数和 0/1 二进制数作为特例。自然语言描述仍然非常重要。例如,一篇新闻文章,仅使用文字(可量化值)而没有任何数字来严厉批评 Flutter 的性能,仍然可能是有意义的,并且可能产生重大影响。选择有限的范围只是因为我们的资源有限。
描述性能所需的量通常称为指标。
要浏览无数的性能问题和指标,可以根据表演者进行分类。
例如,本网站上的大部分内容都是关于 Flutter 应用程序性能的,其中表演者是 Flutter 应用程序。基础设施性能对 Flutter 也很重要,其中表演者是构建机器人和 CI 任务运行程序:它们严重影响 Flutter 合并代码更改的速度,从而提高应用程序的性能。
此处,故意将范围扩大到包括应用程序性能问题之外的性能问题,因为无论表演者是谁,它们都可以共享许多工具。例如,Flutter 应用程序性能和基础设施性能可能共享相同的仪表板和类似的警报机制。
扩大范围还可以包括传统上容易被忽略的表演者。文档性能就是一个这样的例子。表演者可以是 SDK 的 API 文档,而指标可以是:认为 API 文档有用的读者的百分比。
性能为何重要?
回答这个问题不仅对于验证性能工作至关重要,而且对于指导性能工作以使其更有用也至关重要。“性能为何重要?”的答案通常也是“性能如何有用?”的答案
简单来说,性能很重要且有用,因为在范围内,性能必须具有可量化的属性或指标。这意味着
- 性能报告易于使用。
- 性能几乎没有歧义。
- 性能可比较且可转换。
- 性能是公平的。
并非非性能或不可衡量的议题或描述不重要。它们旨在突出性能更有用的场景。
1. 性能报告易于使用
性能指标是数字。阅读数字比阅读一段文字容易得多。例如,工程师可能需要 1 秒钟才能将性能评级从 1 到 5 作为数字使用。同一位工程师可能需要至少 1 分钟才能阅读完整的 500 字反馈摘要。
如果数字很多,则可以轻松地总结或可视化它们以供快速使用。例如,您可以通过查看其直方图、平均值、分位数等来快速使用数百万个数字。如果一个指标有数千个数据点的历史记录,那么您可以轻松地绘制一条时间线来读取其趋势。
另一方面,拥有 n 个 500 字的文本几乎可以保证以 n 倍的成本来使用这些文本。分析数千个历史描述将是一项艰巨的任务,每个描述有 500 个单词。
2. 性能几乎没有歧义
性能作为一组数字的另一个优势在于其明确性。当您希望动画每帧有 20 毫秒的性能或 50 fps 时,对于数字几乎没有不同的解释空间。另一方面,用文字描述相同的动画,有人可能会称之为好,而另一些人可能会抱怨它不好。同样,不同的人对同一个单词或短语的解释可能不同。您可能会将一个好的帧速率解释为 60 fps,而其他人可能会将其解释为 30 fps。
数字仍然可能很嘈杂。例如,每帧的测量时间可能是该帧的真实计算时间,加上 CPU/GPU 花在一些不相关工作上的随机时间量(噪声)。因此,指标会波动。尽管如此,数字的含义没有任何歧义。而且,还有严格的理论和测试工具来处理这种噪声。例如,您可以进行多次测量以估计随机变量的分布,或者您可以对许多测量结果取平均值,通过大数定律消除噪声。
3. 性能可比较且可转换
性能数字不仅具有明确的含义,而且还具有明确的比较。例如,毫无疑问 5 大于 4。另一方面,弄清楚优秀是否比卓越更好或更差可能很主观。同样,你能弄清楚史诗是否比传奇更好吗?实际上,短语强烈超出预期在某人的解释中可能比卓越更好。只有在将强烈超出预期映射到 4,将卓越映射到 5 的定义之后,它才变得明确且可比较。
数字也可以使用公式和函数轻松转换。例如,60 fps 可以转换为每帧 16.67 毫秒。帧的渲染时间x(毫秒)可以转换为二进制指示符isSmooth = [x <= 16] = (x <= 16 ? 1 :0)
。这种转换可以复合或链接,因此您可以使用单个测量值获得各种数量,而不会增加任何噪音或歧义。然后,转换后的数量可用于进一步比较和消耗。如果您处理的是自然语言,则几乎不可能进行此类转换。
4. 性能公平
如果问题依赖于冗长的文字才能被发现,那么就会给那些更冗长(更愿意聊天或写作)的人或更接近开发团队的人带来不公平的优势,他们有更大的带宽和更低的聊天或面对面会议成本。
通过使用相同的指标来检测问题,无论用户距离多远或多么沉默,我们都可以公平地处理所有问题。反过来,这使我们能够专注于影响更大的正确问题。
如何使性能有用
以下从略有不同的角度总结了此处讨论的 4 点
-
使性能指标易于使用。不要用大量数字(或文字)淹没读者。如果数字很多,请尝试将它们总结成较小的一组数字(例如,将许多数字总结成一个平均数字)。仅在数字发生显着变化时才通知读者(例如,对峰值或回归的自动警报)。
-
使性能指标尽可能明确。定义数字使用的单位。精确描述数字的测量方式。使数字易于复制。当有大量噪音时,请尝试显示完整的分布,或通过聚合许多有噪声的测量值尽可能消除噪音。
-
使比较性能变得容易。例如,提供时间表以将当前版本与旧版本进行比较。提供方法和工具将一种指标转换为另一种指标。例如,如果我们可以将内存增加和 fps 下降都转换为用户流失数量或以美元表示的收入损失,那么我们可以比较它们并做出明智的权衡。
-
让性能指标监控尽可能广泛的人群,这样就不会有人掉队。