第1章 导读

人们常说:“性能为王。”十年前如此,当然现在也未改变。根据文献(Dom,2017),2017年全球每天都在制造250亿亿[1]字节的数据,而根据文献(Sta,2018)的预测,这个数字每年还要增大25%。在日益以数据为中心的世界中,信息交换需求的增长促进了对更快的硬件和软件的需求。公平地讲,数据的增长不但对算力也对网络和存储系统提出了要求。

在PC时代[2],开发者通常在操作系统上直接编程,可能用到介于应用程序和操作系统之间的一些库函数。而在云计算时代,软件栈层次变得更深、更复杂,大部分开发者接触的软件栈顶层离硬件层更为遥远。栈的中间层把底层硬件做了抽象,这样当新的计算负荷出现时可以采用新型的计算加速单元。然而,这种演进的负面影响是现代应用程序开发者对运行他们软件的实际硬件不甚了解。

得益于摩尔定律,过去几十年软件开发者一直在“搭便车”。一些软件供应商更愿意等待新一代的硬件平台来提升应用程序的执行速度,而不是花费人力来优化代码。在图1中,我们可以看到单线程性能[3]的增长速度正在放缓。

图1 微处理器40年趋势数据(©图片来自K.Rupp的karlrupp.net网站)

图中到2010年的原始数据由M.Horowitz、F.Labonte、O.Shacham、K.Olukotun、L.Hammond和C.Batten收集和绘制,图中2010年到2015年的数据由K.Rupp收集

当每代的新硬件不再显著提升性能(Leiserson et al.,2020)时,我们就必须更加关注代码的运行速度。在寻找性能提升的方法时,开发者不应该依赖硬件,而是应该优化应用程序的代码。

“当今的软件效率非常低,因此再次成为软件程序员构建真正优化技能的黄金时代。”

—Marc Andreessen,美国企业家和投资人(a16z Podcast,2020)

个人经验 在Intel工作时,我经常听到这样的故事:当客户遇到应用程序执行慢的问题时,他们会立刻下意识地抱怨Intel的CPU太慢了。但Intel派出性能专家并跟客户一起调优应用程序后,应用程序的执行速度提升5倍甚至10倍的案例并不少见。

获得高水平性能的过程充满了挑战,通常需要付出大量的努力,希望本书提供的一系列工具能帮助你实现较高的性能。