C++程序性能优化的几个技巧
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈C++程序性能优化的几个技巧:
** 大部分程序的90%执行时间仅花费在大约10~20个不同的函数上。如果费力气所优化的是被执行频率很低的函数,那么这个优化工作不会对程序性能有明显提高。所以有好钢就一定要用在刀刃上。
** 在优化时可能会对程序的可读性及可维护性造成损失。要权衡得失。并做好注释。
** 不要过早的进行优化工作。当一个函数已经被优化到紧凑且几近完美的程度时,如再遇到需要改动或重用时会发现无从下手。
** 算法的选择是决定性能的关键。所以要认真考虑算法,避免不必要的计算。
** 要避免在循环中每次为查找同一个元素就便利整个列表或数组。可以通过优化数据结构或者使用变量来保存这个元素的方法来进行优化。
** 虚函数可能会产生额外的开销。
** 将较简单且被频繁调用的函数设为内联可以有效提高程序性能。内联函数inline:当函数做上内联标记以后,编译器会在调用此函数时将函数的内容复制到此处。这样做的好处是可以减小函数调用时的开销。但是因为每次调用之处都会复制,所以生成的可执行代码会变得庞大。注意:有时内联函数太复杂编译器会拒绝内联,将inline忽略掉而不提示警告或错误;内联函数只能出现在.h文件中。建议将其紧跟在类定义之后。
** 当调用函数的参数为一个较大的数据类型或一个对象时,切忌使用值传递方式,要使用指针或引用的方式传递。因为值传递需要创建一个临时的对象备份,不要忘了,对象的创建会调用构造函数,然后还需要复制对象的内容到新创建的对象中,用完之后还要调用析构函数。更甚者如果此对象类中又包含了其他类型的对象…这开销可是够大的!当然,
** 不使用的空函数注释掉。
** 下面的情况看看编译器背着你做了什么:
如有函数
void SetRotation(const Rotation & rot);
Rotation类定义如下:
Class Rotation
{//…..
Public:
Rotation();
Rotation(float fdegree, int iDirection=1,float fRoll=0.0);//注意此构造函数
//…
}
当执行如下代码时:
float fDegree=90.0;
SetrRotation(fDegree);
SetrRotation函数需要一个Rotation类形的参数,但是得到的却是float类型的。虽然编译能够通过并且执行结果也没错,可编译器是怎么做的呢?虽然它知道这个float类型的参数不是它想要的,但它还知道使用这个float型参数可以创建出一个Rotation类型变量,于是它就这么做了。接下来又得构造又得析构。这个函数如果位于执行频率较高的代码段。那岂不又影响执行效率了?所以不要为了少敲几下键盘图省事儿。