首先要明确一点,C++的效率是C++的必要生命元素之一。C++是面向对象的,但同时也支持所有C的编程方法。这使得我们大部分C++程序在面向过程和面向对象之间徘徊,这也正是C++的优点之一,程序员可以决定多大程度上面向对象以提高开发速度并降低维护成本,同时他们还可以决定多大程度上面向过程以提高运行速度。当然,C++是无比繁杂的,这些大思想可以偶尔拿来装一下,一直讨论则是无益的,脚踏实地的学习知识点才是王道。
今天就本人在学习C++的过程中总结的几点提高程序效率的方法和大家共享,望各路大神批评指正。
1.减少复制构造函数的调用
这是由语言特性决定的,类对象的复制相比内置类型的复制开销要大很多,我们应该尽量避免频繁调用类的复制构造函数。这里举几个小例子说明一下:①在函数形参中,传对象的const引用而不是传值,引用可以避免调用复制构造函数以节约复制成本②vector的size是成倍增加的,一但超过现有的大小,就好全盘复制一遍前面的元素。如果vector里放的是类对象并且数目较多,那这个开销是很大的,所以如果空间富裕,我们可以先用resize()方法预先分配一些空间以减少不必要的复制过程。(如果事先知道所用数组的大小,那建议用堆上的静态数组代替vector,这是另一个话题了,不在多说)③数组下标排序法。如果要对含有类的大数组进行排序,因为排序过程涉及多次元素交换,所以会多次调用类的复制构造函数,这时可以考虑采用排序下标数组的方法,新建一个数组放原数组的下标,通过对这个下标数组排序间接实现对原数组的排序。
2.利用面向过程代替面向对象
正如前面提到的,C++是支持C语言的全部特性的,其实就算是不支持,就比如说java,我们同样可以用java来编写面向过程的程序,所以准确来说面向过程或者面向对象更是一种思维方法而不是语言特性。好像又扯大了,我们还是举个小例子来说明吧:在基于种群的智能算法中有这样一个过程,先按照个体适应值对种群(一般为一个对象数组)排序,然后选出前50%个体进行交叉组合形成一个新的种群(和前面大小相同)。如果按照面向对象的思维,就应该直接将对象数组进行排序然后进行选择最后进行组合,这样最直观而且最贴近客观现实。但我们在第一点中已经说明了,对象数组排序不是一个好的策略,除了采用下标排序法我们还可以利用面向过程的思维。定义三个数组,分别放置原种群、交叉种群和选择后的种群,通过对比相应位置的个体适值来选择最后种群中的个体。总之是将对一个种群数组的操作分解成三个数组间的相互操作。这样简化了排序和选择过程,可以很大程度上提高算法效率。
3.其他的一些技术手段
其他一些零散方法就靠大家平时积累了,比如①减少外存的读写次数,由于计算机读硬盘花费的时间为读内存的数万倍,所以要有组织有计划的与硬盘进行数据交换,不要一分钟读个十来次,每次就读一两个字节。②利用客户的“空闲”时间进行操作,当用户查询了一个表格正在查看时,程序可预先准备下一次的查询结果,或者存取数据等等,这样可以减少用户等待时间。③使用内联函数,减少函数调用过程所消耗消耗的时间。
最后要说明的是,天下没有免费的午餐!效率的提高绝大部分是其他东西的损失换来的,我们在提高效率的同时要考虑负面作用,结合当前目标以确定是否要进行这场效率买卖。