码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 运算运行效率的提高技巧

时间:2018-12-01 11:06:44      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:code   int   跳转   浮点   一起   style   基本类型   局部变量   编译   

尽量避免使用值传递,推荐使用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++ 运算运行效率的提高技巧

标签:code   int   跳转   浮点   一起   style   基本类型   局部变量   编译   

原文地址:https://www.cnblogs.com/Yu-900914/p/10048075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!