前言
关于作者
Denis Bakhvalov 是 Intel 的一名性能工程师(performance engineer),负责优化生产级应用程序和基准测试。在此之前,他曾在 Intel 编译器团队工作,参与为多种架构开发 C++ 编译器。Denis 于 2008 年开始其软件开发职业生涯,在一家大型 C++ 企业财务应用公司工作。在加入 Intel 之前,他在诺基亚(Nokia)工作了三年,从事嵌入式软件的编写。
性能工程和编译器一直是他最主要的兴趣所在。2016 年,Denis 创办了 easyperf.net 博客,在那里撰写关于底层性能优化(low-level performance optimizations)、C/C++ 编译器和 CPU 微架构(microarchitecture)的文章。工作之余,Denis 喜欢足球、国际象棋和旅行。
联系方式:
- 邮箱:dendibakh@gmail.com
- X(前 Twitter):\@dendibakh
- LinkedIn:\@dendibakh
作者寄语
我写这本书只有一个简单的目标:帮助软件开发者更好地理解其应用程序的性能。我深知底层性能工程对于初学者乃至有经验的开发者来说有多么困难。我还记得自己刚接触性能分析的那段日子——面对一堆陌生的指标,试图将无法匹配的数据拼凑在一起,不知所措。经过多年的摸索,终于有那么一刻"豁然开朗",所有拼图都拼在了一起……尽管有时我仍然在和同样的问题打交道。
当我在性能工程领域迈出第一步时,该主题唯一优质的信息来源就是软件开发者手册,而那不是主流开发者喜欢阅读的东西。坦率地说,如果在我学习底层性能分析的时候能有这本书,那该多好。2016 年,我开始在博客上分享所学,并收到了读者的一些积极反馈。其中一些人建议我将这些信息整合成一本书。这本书的存在,要"归功于"他们。
很多人问我为什么选择自出版。事实上,我最初确实尝试向几家知名出版社推介,但他们认为出版这样一本书没有足够的商业价值。然而我真的很想写它,所以我还是决定自己动手。最终效果不错,所以我也决定自出版第二版。
第一版于 2020 年 11 月发布,在社区中获得了广泛好评,但读者也给了我大量建设性的批评意见。其中最常见的反馈是希望加入实验练习。一些读者抱怨内容过于聚焦 Intel CPU,没有涵盖 AMD 和 ARM 等其他架构。还有读者建议我将系统性能也纳入讨论,而不仅仅是 CPU 性能。第二版在所有这些方面都有所扩展,内容是第一版的两倍。
特别值得一提的是,我在第二版中新增了练习环节。我创建了一套名为"Performance Ninja"的补充在线课程,包含二十多个实验作业。我建议你用这些小谜题来练习优化技术,检验自己对材料的理解程度。我认为这是本书区别于其他书籍的最大亮点,希望它能让你的学习过程更加有趣。关于在线课程的更多细节,请参见 [chapter1Exercises]。
我深知底层性能优化并不容易。我尽力把每个概念解释得尽可能清晰,但这个主题本身非常复杂,需要通过实验和实践才能真正掌握。我鼓励你花时间通读各章,并在在线课程中动手实践所提供的示例。
在我的职业生涯中,我从未回避软件优化任务。每当我成功让程序跑得更快,都会获得一种多巴胺的快感。这种发现的兴奋感和成就感让我更加好奇,渴望探索更多。我最初的性能工作非常缺乏系统性,而现在这已经是我的职业,但当我让软件跑得更快时,我依然会感到非常开心。希望你也能体验到发现性能问题的喜悦,以及修复它们的满足感。
我真诚地希望这本书能帮助你学习底层性能分析。如果你因此让自己的应用程序跑得更快,我就认为自己的使命已经完成了。
你会发现书中某些地方我用"我们"而不是"我"。这是因为我得到了很多人的帮助。完整的贡献者名单可以在本书末尾的"致谢"部分找到。
本书的 PDF 版本和"Performance Ninja"在线课程均免费提供。这是我回馈社区的方式。
目标读者
如果你正在开发对性能要求极高的应用程序,那么这本书非常适合你。它主要面向高性能计算(HPC, High-Performance Computing)、人工智能(AI)、游戏开发、数据中心应用程序(如 Meta、Google 等公司的应用)、高频交易(HFT, High-Frequency Trading)以及其他性能优化价值被广泛认可的行业的软件开发者。
对于任何想更好地理解应用程序性能、了解如何改进它的开发者,这本书也大有裨益。也许你只是对性能工程充满热情,想了解更多;或者你想成为团队中最聪明的工程师——这都很好。我希望书中呈现的内容能帮助你发展可以应用于日常工作的新技能,并潜在地推动你的职业发展。
理解本书示例需要具备基本的 C 和 C++ 编程语言背景。能够阅读基本的 x86/ARM 汇编代码会有帮助,但并非硬性要求。我还期望读者熟悉计算机体系结构和操作系统的基本概念,如"CPU"、"内存"、"进程"、"线程"、"虚拟内存(virtual memory)"、"物理内存(physical memory)"、"上下文切换(context switch)"等。如果这些术语对你来说还很陌生,建议先学习这些前置知识。
建议你从头开始,按章节顺序阅读本书。如果你认为自己是性能分析的初学者,我不建议跳过任何章节。阅读完成后,每当你面临性能问题不知如何解决时,可以把这本书作为灵感来源。你可以快速浏览本书第二部分,了解哪些优化技术可以应用于你的代码。
我将在我的博客上发布本书的勘误和其他相关信息,网址如下:https://easyperf.net/blog/2024/11/11/Book-Updates-Errata。