优化之路:C、C++程序代码的优化
IT商界
在高级语言中,程序的优化主要应该从数据结构、算法、控制流程等方面入手。各种语言各有它自身的特点,我们只能根据具体的语言来说明代码优化的方法。当然,高级语言太多,笔者也不可能把每一种语言拉进来,所以这里我主要谈谈C&C++、Java、Delphi等语言相关的代码优化。而对于其他一些语言,也可以从这些优化方法中找到适合自身的优化方案。
对C++程序的优化一定是大多数程序员最感兴趣的话题了吧! 在此先说说基于C、C++的代码优化,希望能够起到抛砖引玉的作用!
(1)在ANSI/ISO C/C++规范中明确建议:“不要使用macro和.h,应该使用程序中的常量定义和函数替代”。Macro(宏)对程序员来说的确带来过不少方便,但大量的宏定义往往又给我们带来更多的麻烦。建议使用inline内连函数替代宏调用。内连函数有宏调用的功能,且避免了宏调用的弊端。
(2)集合、子集类型是不被标准的C++支持的,但是可以用类来模拟,毕竟C++的对象结构是最复杂最灵活的。在Borland的C++Builder中,就提供了源于Pascal的集合,这对我们追求代码高效率的开发者来说,是不可取的。
(3)字符串处理是Pascal的强项之一。 但是C++中的string/AnsiString等是用类/数模拟的,所以性能有很大的损失!建议使用C++Builder/Delphi的程序员尽量不使用AnsiString。
(4)C++中的运算符new和delete相对于C中的malloc()和free()函数更优越。它们虽然都提供了动态和释放分配内存的方法,但是使用new和delete能自动返回正确的指针类型,不用进行强制指针转换。另外还可以避免一些错误。
(5)过量的异常处理往往导致程序难于使用且效率低下。C++在异常处理方面存在一定的不足,C++Builder中对异常进行了一定的扩充,使用程序对异常的捕获和和处理更方便。于是很多程序员在写程序时对明知道不会出错的代码也要进行一下异常处理,这无异于画蛇添足吧!
(6)正确使用循环。使用循环虽然简单,但使用不当,往往可能带来很大的性能影响。原则是将问题分解为小的循环,不在循环内做多余的工作(如赋值、常量计算等),避免死循环。还可以考虑将循环改为非循环来提高效率。
(7)类的主要好处之一是它封装的特征。这个特征对类对象的使用者隐藏了内部的工作。这本是非常好的事情,但不幸的是,类的使用者往往不能确定类中各种方法如何影响性能,这样就很容易掉入性能的陷阱中。比如:常用的MFC、VCL它们都提供了丰富的类库,我们在使用时应该选择效率较高的类和调用效率高的方法函数。
(8)尽量在类设计时减少虚函数的数目。函数地址在运行时进行滞后绑定,这对于面向对象的编程语言来说相当重要。C++不同于Java、smalltalk的是让程序开发者自己决定对哪一个函数进行滞后绑定。C++之所以这么做,是出于对性能方面的考虑,特别是对多态性提供滞后绑定是要付出相当大的代价的。即使是只有一个虚函数的类,对它的每一个实现都需要一个虚函数表和一个指向它的指针。指向虚函数表的指针必须在实现类实例时进行初始化。另外,每当一个虚函数被调用时,必须为函数在运行时进行的查找付出代价。