后记(Epilog)
感谢您通读全书。希望您读来愉快,并从中有所收获。如果本书能帮助您解决实际问题,我将倍感欣慰,也将视之为成功的证明,证明我的努力没有白费。在您继续前行之前,请允许我简要回顾本书的要点,并给出最后的建议:
- 现代软件存在大量低效之处,在减少碳排放和改善用户体验方面有巨大的优化空间。人们厌恶使用缓慢的软件,尤其当它降低了工作效率时。并非所有快速软件都是一流软件,但所有一流软件都是快速的。性能(Performance)是最重要的竞争力。
- 单线程 CPU 性能的提升已不如几十年前那般迅猛。当每一代硬件不再能提供显著的性能提升时,开发者应当开始主动优化软件代码。
- 多年来,性能工程(Performance Engineering)一直是一个小众领域,但如今已成为主流——软件厂商已意识到优化不足对其商业利益的影响。性能调优(Performance Tuning)比过去四十年中任何时候都更为关键,它将成为近未来性能提升的主要驱动力之一。
- 底层性能调优的重要性不容小觑,哪怕只有 1% 的改进。这些微小改进的累积效应才是真正产生差异的关键。
- Donald Knuth 有一句名言:"过早优化是万恶之源。"[Knuth1974StructuredPW] 然而反之亦然。推迟性能工程工作同样可能为时已晚,造成与过早优化同等的危害。在设计未来产品时,切勿忽视性能方面的考量。将自动化性能基准测试集成到 CI/CD 流水线中,以保障项目质量。尽早测量,持续测量。
- 要达到峰值性能,必须了解 CPU 微架构(Microarchitecture)知识。然而,您的心智模型(Mental Model)永远无法与 CPU 的实际微架构设计完全吻合。因此,在对代码进行特定修改时,不要仅凭直觉。预测某段代码的性能几乎是不可能的。务必实测!
- 在测量性能时,要理解所观察到的性能结果背后的技术原因。始终深入测量一个层次,并尽可能多地收集指标以支撑结论。
- 性能工程之所以困难,是因为没有可供遵循的预设步骤或算法。工程师需要从不同角度来解决问题。了解可用的性能分析方法和工具(包括硬件和软件)。我强烈建议采用自顶向下微架构分析(Top-down Microarchitecture Analysis,TMA)方法论,它将帮助您把工作引向正确的方向。
- 当您识别出应用程序的性能瓶颈所在,工作就已完成了一大半。根据我的经验,修复问题通常比找到问题根因更容易。 在第二部分中,我们介绍了针对每种 CPU 性能瓶颈的一些基本优化方法:如何优化内存访问和计算操作,如何消除分支预测错误(Branch Mispredictions),如何改善机器码布局(Machine Code Layout),以及其他若干优化手段。当您的应用程序遇到这些问题时,可以将第二部分的各章作为参考,了解可用的优化选项。
- 来自不同厂商的处理器并非生而平等。它们在支持的指令集架构(Instruction Set Architecture,ISA)和微架构实现上各有差异。在特定平台上达到峰值性能,需要充分利用最新的 ISA 扩展,避免常见的微架构特定问题,并根据特定 CPU 微架构的优势对代码进行调优。
- 多线程程序为性能调优增加了一个新的复杂维度。它们引入了新类型的瓶颈,需要额外的工具和方法来分析和优化。检查应用程序随线程数量的扩展性(Scalability)是识别多线程程序瓶颈的有效方式。
希望您现在对底层性能优化有了更深入的理解。当然,本书并未涵盖您日常工作中可能遇到的所有场景。我的目标是为您提供一个起点,展示在现代 CPU 上进行性能分析和调优的可能选项与策略。祝您在应用程序中发现性能瓶颈时获得探索的乐趣,在修复它们时感受到成就感。
祝性能调优愉快!
我将在以下 URL 的博客上发布本书的勘误和其他相关信息:https://easyperf.net/blog/2024/11/11/Book-Updates-Errata。
如果您还没有完成 perf-ninja 练习,我鼓励您花时间去做一做。这些练习将帮助您巩固知识,为现实中的性能工程挑战做好准备。
附言:如果您喜欢这本书,请将它推荐给您的朋友和同事。如果您能在社交媒体平台上为本书背书,帮助传播,我将不胜感激。