序言
如果就C++(www.cppentry.com)的性能问题对软件开发者进行一次非正式调查,您会毫无疑问地发现,他们中绝大多数人把性能问题视为C++(www.cppentry.com)语言相较于其他优秀语言的阿特琉斯之踵。自从C++(www.cppentry.com)诞生以来,我们多次听到这样的话:开发性能要求严格的程序尽量不选择C++(www.cppentry.com)。在开发人员看来,编写这一类的程序首选的语言通常是标准C,有时甚至是汇编语言。
作为软件社区的一分子,我们有机会目睹了这种神话般语言的发展和壮大。几年前,我们充满热情地加入了投入C++(www.cppentry.com)怀抱的浪潮中,我们身边的许多开发项目也都很积极地投身于其中。一段时间过后,以C++(www.cppentry.com)实现的软件解决方案开始发生变动。人们发现C++(www.cppentry.com)的性能不太理想,所以就逐渐放弃了它。在对性能要求严格的领域,人们对于C++(www.cppentry.com)的热情冷却了下来。当时我们正在为别人提供网络软件,这些软件的运行速度是不容协商的,也就是说速度必须放在第一位。由于网络软件位于软件层级链中相对低的层次,而且大量的应用程序位于网络软件之上并且依赖于它,所以网络软件的性能要求比较严格。较低层级链上的程序性能不佳会对较高层级链上的程序产生影响。
并不是我们才有这样的经验。在我们周围,不少骨灰级的C++(www.cppentry.com)使用者也很难用C++(www.cppentry.com)取得他们所期盼的性能。没有人认为问题在于面向对象开发模式有多难学,反而怪罪C++(www.cppentry.com)语言本身。尽管C++(www.cppentry.com)编译器本质上还处于"婴儿期",但C++(www.cppentry.com)语言已经被打上了"天生就慢"的标签。这种看法迅速传播并被广泛地当做事实接受。不使用C++(www.cppentry.com)的软件企业经常说他们这么做是因为性能是他们考虑的主要因素。这种考虑源于人们认为C++(www.cppentry.com)语言无法达到与之相对的C语言所达到的性能。因此,C++(www.cppentry.com)很少在一些对性能要求很严格的软件领域取得成功,如操作系统内核、设备驱动程序、网络系统(路由器、网关、协议栈)等。
我们花费了很多年时间用来剖析用C和C++(www.cppentry.com)代码写成的大型系统,以充分发挥这些代码的性能。在整个过程中我们竭尽全力寻找用C++(www.cppentry.com)产生高效程序的潜力。我们发现事实上C++(www.cppentry.com)确实是有这个潜力的。在本书中,我们试着与您分享这些经历,以及在剖析C++(www.cppentry.com)效率的过程中所得到的一些经验教训。编写高效的C++(www.cppentry.com)代码,并非轻而易举,也不是比登天还难。要做到这一点,需要理解性能规律,以及掌握一些有关C++(www.cppentry.com)性能陷阱和缺陷的知识。
80-20法则是软件结构领域的一个重要原则。在本书的写作中我们同样认同它的存在:20%的性能缺陷将会占用我们80%的时间。因此我们把精力集中在最有价值的地方。我们主要对那些经常在工业化代码中出现,并有显著影响的性能问题进行剖析。本书不对各种可能出现的性能缺陷及其解决方法进行详尽的讨论,因此,将不讨论我们认为深奥而不常见的性能缺陷。
毫无疑问,我们的观点来自于我们作为程序员在开发服务器端、对性能要求严格的通信程序中获取的实际经验。由此形成的观点会在以下方面影响本书:
在实践中所遇到性能问题与在科学计算、数据库程序和其他领域中所遇问题在本质上稍有不同。这没什么大不了的。普遍的性能原则适用于各个领域(包括在网络软件以外的领域)。
尽管我们尽量避免,但有时候还是会人为地虚构一些例子来佐证一些观点。以前我们犯过足够多的编码错误,所以能提供足够多的来自于我们所编写的真实的产品代码中的例子。我们的经验得来不易--是从自己和同事所犯的错误中学习而来的。我们将尽可能使用实际范例来证明我们的观点。
我们将不对算法渐近复杂性、数据结构,以及数据的访问、排序、搜索及压缩的最新和最优技术进行深入的研究。这些确实是重要的论题,但是其他地方已给出大量的论述[Knu73、BR95、KP74]。我们将着重论述那些简单、实用、常见的、会大幅提高性能的编码和设计原则。也许您在不知情的状态下使用了会导致隐含性高消耗的语言特性,也许您违反了敏感(或是不太敏感)的性能原则,这些会导致性能降低的常见的设计和编码方法,我们都将一一指出。
我们如何区分传说与现实呢?C++(www.cppentry.com)的性能真的比C语言的要差么?笔者认为人们通常所持的C++(www.cppentry.com)性能差的观点是不正确的。确实,在一般情况下,如果把C语言和看起来与C语言相同的C++(www.cppentry.com)版本相比,前者通常要快一些。但同时笔者也认为两种语言在表面上的相似性通常是基于它们的数据处理功能,而不是它们的正确性、健壮性和易维护性。我们的观点是如果让C语言程序在上述方面达到C++(www.cppentry.com)程序的级别,则速度差别就会消失,甚至可能是C++(www.cppentry.com)版本的程序更快。
C++(www.cppentry.com)不是天生就较慢或较快,这两者都是有可能的,关键要看怎样使用它以及想从它那里得到什么。这与如何使用C++(www.cppentry.com)有关系:运用得当的话,C++(www.cppentry.com)不仅可以让软件系统具备可接受的性能,甚至还可以获得出众的性能。
在此我们向那些对本书做出过贡献的人表示感谢。万事开头难,我们的编辑Marina Lang对本书写作项目的启动给予了帮助。Julia Sime为早期的书稿做出了不小的贡献,Yomtov Meged也给我们提供了很多有价值的建议。他还指出了我们的想法与客观情况之间的细微差别。尽管有时它们碰巧会一致,但对我们而言还是有必要加以区分的。
十分感谢Addison-Wesley聘请的两位评审,他们的反馈信息非常有价值。
同时感谢对原稿进行了检查的朋友和同事,他们是(排名不分先后):Cyndy Ross、Art Francis、Scott Snyder、Tricia York、Michael Fraenkel、Carol Jones、Heather Kreger、Kathryn Britton、Ruth Willenborg、David Wisler、Bala Rajaraman、Don "Spike" Washburn和Nils Brubaker。
最后但并非最不重要,还要感谢我们各自的妻子:Cynthia Powers Bulka和Ruth Washington Mayhew。
Dov Bulka
David Mayhew