13.10 编译器优化
一个优秀的编译器可以代替开发者实施一些重要的优化,而无须开发者对源代码进行任何干预。第一个想到的优化是寄存器分配。当变量位于寄存器中时,载入和存储该变量是最快的。否则,我们将不得不花费很多时钟周期从其他地方获取该变量。如果此时产生一个更新,那么还需要将其存回到原来的位置。在这种情况下,如果变量不在缓存中,那么情况会变得更加糟糕。在现代计算机体系结构中,一次单独的内存访问至少需要5个时钟周期。如果变量被存储在寄存器中,则这一切可以避免。因为对执行路径中的许多方法都可以使用寄存器分配,所以寄存器分配是一种重要的优化方法。当遇到循环索引变量时,这种优化的作用更是特别明显。因为每次循环迭代时都需要访问和更新这些变量。
第二个需要特别注意的优化就是内联。第8、9、10章已经强调了内联可以显著提高很多C++(www.cppentry.com)应用程序性能的观点。第4章讨论的返回值优化是另一种对C++(www.cppentry.com)程序员有用的优化方法。诸多优化方法不胜枚举,可以通过查阅[O98]来了解关于各种编译器优化更多详细的信息。我们要强调的是,优化方法有很多,但是一定要明白,您不能想当然地使用它们。
通常情况下,编译器默认根本不会进行任何优化。这意味着这些重要的性能优化将不会生效--即使在代码中使用了关键字register和inline也无济于事。编译器会自动忽略这些关键字,而且它经常这样做。为了更好地利用这些优化手段,必须通过向命令行添加开关(在UNIX环境下为-O)或者在GUI界面上选择性能优化选项,手工打开编译器优化。
由于针对不同应用程序手工所做的编译器优化都不一样,所以很难精确量化编译器优化的影响。在我们的经历中,我们所看到编译器优化对各种应用程序的速度有20%~40%的提升,这显然是非常诱人的。