c++ 运算运行效率的提高技巧
Posted yu-900914
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 运算运行效率的提高技巧相关的知识,希望对你有一定的参考价值。
尽量避免使用值传递,推荐使用const 引用来传递参数
临时变量的代价。
循环体中的局部变量,尽量在循环体内定义
复制操作与构造析构函数的代价差异。
避免过大的循环
cache的时间局限性和空间局限性
时间局限性:如果一个存储单元被访问,则可能该单元会很快再次被访问,因为存在循环;
空间局限性:如果一个存储单元被访问,则可能该单元临近的单元也可能很快被访问,因为程序中大部分指令是顺序存储,
数据也一般是集中在一起的。
如果循环体的空间代价大于cache的容量,则不能充分利用cache了,因为cache需要与内存交换代码指令和数据。
局部变量的效率高于静态变量
尽量减少除法的使用
无论对于整数还是浮点数,出发都是一个运算速度很慢的指令。以下的一些简单方法可以用来来提高效率:
- 用 if(a*n > b) 来代替 if(a>b/n) ;
- 尽量使用无符号整形变量;
- 除数使用常量有利于编译器优化,也可以用const来修饰变量达到目的;
- 使用 x << 3 代替 x/8;
- 使用 x&7 代替 x/8;
将小粒度函数申明为内联函数(inline)
多使用构造函数初始化代替赋值初始化
构造函数与临时变量&赋值的代价差异。
尽量减少循环的嵌套层数,尝试使用多个循环代替
跳转和分支执行代价高,如果可能尽量少用
- 函数调用需要两次跳转,外加栈内存操作;
- 尽量减少再循环内调用函数;
- 尽量使用switchcase 代替 较长的 ifelse分支;
对于优先使用 += -= 代替 + -;
而对于基本类型优先使用 + - 而不是 += -=;
如果你需要初始化一大段的内存,尽量使用 memset 代替赋值
++ i 代替 i++
13.
1 c = a+b; 2 d = a+b+e; 3 f = a+b+g;
优化为
1 c = a+b; 2 d = c+e; 3 f = c+g;
充分利于CPU的流水
利用CPU的流水来做并行计算,比如:
优化前
1 for (int i = 0; i < len; i++) 2 { 3 sum += a[i]; 4 }
优化后:
1 for (int i = 0; i < len; i = i + 4) 2 { 3 sum1 += a[i]; 4 sum2 += a[i + 1]; 5 sum3 += a[i + 2]; 6 sum4 += a[i + 3]; 7 } 8 sum + sum1 + sum2 + sum3 + sum4;
以上是关于c++ 运算运行效率的提高技巧的主要内容,如果未能解决你的问题,请参考以下文章