1.2 谁需要做性能调优
在类似高性能计算(High-Performance Computing,HPC)、云计算服务、高频交易(High-Frequency Trading,HFT)、游戏开发和其他性能关键型领域中,性能工程不需要太多理由来证明其必要性。例如,谷歌报告称,搜索速度降低2%会引起每个用户的搜索量下降2%。对雅虎网站来说,页面加载时间减少400ms会带来5%~9%的新增流量。在用户数量很大的游戏场景,即使是小的性能提升也会产生显著的影响。这些例子表明,服务运行得越慢,使用它的用户越少。
有趣的是,对性能工程有需求的并不局限于上述领域。如今,通用应用程序和服务也需要性能工程,我们日常使用的工具如果不能满足性能方面的需求就无法生存下来。例如,已经集成在微软Visual Studio IDE中的Visual C++IntelliSense[6]功能就有非常苛刻的性能约束要求。如果IntelliSense的自动补全功能可以正常工作,它必须在几毫秒之内完成对整个源代码库的解析[7]。如果需要等待几秒钟才能弹出自动补全建议,那么不会有人愿意使用该代码编辑器。这样的功能必须有非常快的响应速度,并在开发者敲入新代码时能提供有效的连续性体验。类似的应用要想取得成功,只能在设计软件时就考虑到要实现这种效果的性能要求和合理的性能工程。
有时候,高性能工具会在其最初设计的目标领域之外发挥作用。例如,目前类似Unreal[8]和Unity[9]的游戏引擎在建筑、3D展示、电影制作等领域广泛使用。因为它们的性能非常出色,所以它们成了需要2D和3D渲染、物理引擎、碰撞检测、声音、动画等特性的应用程序的自然选择。
“高性能工具并不只是能让用户更快地完成任务,它还能够让工具的使用者用全新的方式完成全新类型的任务”
—Nelson Elhage博客[10]
我不想直白地说人们痛恨运行速度慢的软件,但应用程序的性能是用户换用竞争对手产品的一个因素,重视产品的性能提升可以提高产品的竞争力。
性能工程是重要且有回报的工作,但它可能非常耗时。事实上,性能优化是一场无尽的游戏,因为总是存在值得优化的地方。不可避免地,开发者将会到达收益递减、事倍功半的时候,在这种情况下,进一步的改进需要非常高的工程成本,但是优化效果可能不值得花费如此的高成本。从这一点看,何时停下优化步伐也是性能调优工作的一个关键要点[11]。有些机构通过在代码审核流程中集成信息的方式来达到这一目标:源代码行用相应的“成本”指标进行注释。使用该指标来判断是否值得继续提升性能。
在开始性能调优工作之前,确保有充分的理由这样做。如果不能增加产品价值,为了优化而优化的工作纯属无用工作。合理的性能调优工作总是要先定义性能目标,论述清楚希望达到的结果以及这么做的原因。此外,还要选择度量目标是否达成的指标。关于设定性能目标的更多内容,请参考文献(Gregg,2013)和(Akinshin,2019)。
不管如何,掌握性能分析和调优的技能总是有用的。如果你阅读此书的目的就是学习这项技能,那么请继续阅读下面更精彩的章节。