C++编程中提高程序运行效率的方式(不断更新)

在实际的工作中,利用程序实现同样的功能会有很多种方式,但是考虑到程序的运行时间时,很多方式并不可取。不断提高程序的运行效率,而又不影响程序功能是程序员的不竭追求!

以下是我在工作中总结的提高程序代码效率的方式:

1.整型运行速度快于浮点型,所以能用整型的地方尽量不要用浮点型计算,尤其是除法!移位运算的效率比一般的乘除法效率高!

2.尽量少调用简单函数,例如一个数的平方,直接 a*a,而不要用pow(a,2),pow( )函数的效率很低!

3.容器函数不适合进行数据的插入、删除,但出入栈的效率高;节点函数不适合进行数据的定点访问,但是数据的插入、删除效率高。

4.直接复制的效率高于间接赋值,例如int a(12)高于int a=12(也高于int a;a=12)。

5.双重循环中,最好将大循环放在内层,内存的申请最好放在外面,避免多次重复开辟!重点:多次重复操作是效率低下最为直接的表现!

6.代码尽量简洁(满足功能),结构越复杂效率越低!

7.数据操作最好直接使用内存数据操作(直接操作buffer)。

8.直接使用现有的封装函数很方便,但是效率不是最好的,简单的功能实现,最好还是自己写源码。

9.内存需要用多少就开辟多少,冗余数据会降低效率,也不便于管控内存!

10.尽量避免不同数据类型相互操作,减少数据的类型强转!

11.处理不同事件,需要显著提高效率,可以开启多线程(非常直观有效)!

12.数据在内存上操作的效率是非常高的!尽量避免数据在硬盘上操作,例如,没有特殊要求,不要将内存的数据每次都保存到本地硬盘。

---优化代码,一定要懂数据结构和算法分析!

13.代码前后的防呆很重要!但是过多不必要的防呆(明显不出现的判别式!)会严重降低程序的判定效率。

14.要有良好的“单元测试”习惯,不断优化细小“单元”,提高小模块的效率。

15.熟练使用VS自带的性能分析模块,分析程序中不同代码段的时间分配情况。

16.对于if判断语句,预判为“真”的概率高的语句放在前面,其它根据概率依次放在后面,减少判定的次数。

17.能不用静态变量的,尽量不要用静态变量!可以的话,使用局部变量,也不提倡没有必要的静态局部变量!

18.图像数据的计算,避免直接用OpenCV的数据类型,而使用buffer数据(将mat型转化为unsigned char型)。

19.空间换时间。目前电脑的内存都很大,可以考虑多开辟内存空间,将大模块分散并列计算,最好不要在循环体内重复开辟。

20.for循环内的代码量过大,应该将其拆成多个for循环,这里涉及到了CPU缓存问题!

21.当for循环体系很大时,特别注意循环内的内存开辟问题!能在循环外开辟的内存空间,绝对不能在循环内重复开辟(重复释放),经测试,内外开辟的效率可以相差数十倍!

22.当需要遍历整个Mat类(opencv中矩阵形式)时,切记不要使用 .at< >( , )单点访问的形式!最好是指针的形式 .ptr( ),遇到vector的矩阵向量,最好使用Mat类自带的高阶通道参数 CV_8UC(n),其中n可达到512!,然后采用指针的形式进行数据的访问,效率会大大提高,在我的测试中效率会提高60倍!

23.若平台支持OpenMP,可以采用高度并行的OpenMP进行编程,但是要注意数据的独立性,否则会出现问题!理论上主机有多少核就可以加速几倍!在我的测试中,主机有12核,加速可以达到7倍左右!OpenMP编码有时需要更改代码的结构,看起来比较麻烦,但是对于计算机来说,越是规范的代码,运行效率越高!

24.对于文件流操作,最好用传统的c语言指令,例如,采用fprintf对数据进行输入输出,其速度一般较C++指令快。

25.尽量避免直接使用OpenCV的矩阵乘法,矩阵乘法的效率较低,若矩阵维度较小,可以自行拆成算式计算。在我的测试中,直接乘法计算比矩阵乘法效率高8倍左右!

26.算法调优的小技巧:C代码较C++代码的执行效率高;直接调用成熟的封装库有时还没有自己编写的代码效率高;充分利用计算机的并行计算比单一的串行计算要强很多;越是简单的代码片段并不一定执行效率高,代码要对计算机来说要简洁易懂;调优后的执行效率通常比之前的要提速近百倍!

27.对于速率较高的数据缓存,可以预先开辟内存buffer,数据缓存的时候就直接采用memcpy。一边开辟内存,一边进行缓存可能会遇到数据丢失的情况!

28.向系统申请内存时,要特别注意容量!当程序加大申请内存较多时,要记得随时释放内存。针对系统自行申请的内存(例如std::vector),最好在内存使用完后,自行调用析构函数释放内存(例如,std::vector vec可用 vec.~vector()手动释放 ),而不要等到程序结束后,系统自己去释放,否则累积的内存足以让程序崩溃!注意malloc申请的需要先进行free释放。

29.一般算法程序写好后需要不停地测试优化,为了区别debug模式和release模式,需要在程序中设置判定语句(#if _DEBUG  /*测试语句*/ #endif)以示区别不同版本,所有的调试代码均可在debug下运行,而不会出现在release模式下,这样可以非常方便切换模式,而不影响代码结构。

30.随着项目的需求不断升级,代码量也不断扩增,软件架构的设计模式就越来越显得重要!所以事先了解各种设计模式非常有必要,设计合理的模式会对后续的迭代优化起到至关重要的作用。

31.插件式的架构可以模块化地更改代码,提高代码的编译速度,所以避免将所有代码都放在一个文件中,弱关联性的代码逻辑将会提高效率!

32.在编写函数时,输入参数最好定义为const而不是引用,否则不留意的话可能会改变输入参数的内容!

33.

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值