C\C++代码优化的建议

时间:2022-05-23 21:23:42

~~~~我的生活,我的点点滴滴!!

整理自http://blog.jobbole.com/67880/

我只摘抄了我自己遇到的,感受很深的一些建议

1.记住 阿姆达尔定律

经常使用的代码与函数,就需要尽可能的做更多的优化,不经常使用的可以不优化

例如:产品合格率为99% 可能很多人说,这个已经好高了,快100%了,但是如果产品基数为1千

   那不合格产品个数 num = 10^7 * 0.01 = 10^5 这是什么概率,我相信你们都懂


2.代码先保证正确, 然后在考虑优化


2.1先写正确代码,当你意识到这个函数可能会被经常调用, 进行明显的优化


2.2分步进行性能优化


3.我所了解的那些写出非常高效的代码的人说,他们优化代码的时间,是写代码的两倍


4.跳转与分支执行代价高,如果可能,尽量少用

4.1函数调用需要两次跳转, 外加栈内存操作,很耗时的

4.2使用内联函数处理短小函数来消除函数调用开销

4.3使用if else if等的时候,把经常出现的情况尽可能放在前面,如果可以,尽量使用switch


5.仔细思考函数下标的顺序

5.1两阶或更高阶的数组在内存中还是以一维的方式在存储在内存中,这意味着(对于C/C++数组)array[i][j] 和 array[i][j+1]是相邻的,但是array[i][j] array[i+1][j]可能相距很远。

5.2以适当的方式访问存储实际内存中的数据,可以显著地提升你代码的执行效率(有时候可以提升一个数量级甚至更多)

5.3现代处理器从主内存中加载数据到处理器cache,会加载比单个值更多的数据。该操作会获取请求数据和相邻数据(一个cache行大小)的整块数据。这意味着,一旦array[i][j]已经在处理器cache中,array[i][j+1]很大可能也已经在cache中了,而array[i+1][j]可能还在内存中。


6.尽量避免或减少使用本地变量

6.1本地变量都存储在栈上,如果数量少的话,会存储在cpu的寄存器里,当然我们可以直接声明寄存器变量,在寄存器*问就相当快了

6.2不要将大量数据转换为全局变量


7.减少函数参数的个数

大家都知道,函数参数传递时是在栈上,并且进栈顺序是从右到左,栈上开销大


8.传引用与指针,不传递值,

这个大家都知道,避免不必要的复制操作


9.如果你的函数不需要返回值,请不要定义一个返回值


10.尽量避免数据之间的转换


11.定义对象时 使用类初始化,不要使用赋值

Color c(black) 比 Color c; c = black 快很多,因为后者是两步操作,先构造然后在赋值


12.类的构造函数尽量轻型,也就是尽量在构造函数中少操作

使用类初始化列表 Color::Color(): r(0), g(0), b(0){}

而不是使用Color::Color(){ r = g = b = 0}


13使用左移,右移代替乘除 <<, >>


14对于类, 尽量使用+= -=之类的,因为这样能避免产生中间临时变量


15推迟本地变量的定义 

例如 

if( true == xx )

{

int a = 10;

//dosomething

}这个int a 如果定义在if外面 ,那就是不必要的,因为xx有可能为false的情况,那样就省了a的开销


16避免在线程执行体中反复动态申请内存分配

16.1动态内存对于存储场景和运行期间其他数据都很有用

 16.2但是,在许多(大多数)的系统动态内存分配需要获取控制访问分配器的锁。对于多线程应用程序,现实中使用动态内存由于额外的处理器导致了性能下降,因为需要等待分配器锁和释放内存。

 16.3即便对于单线程应用,在堆上分配内存也比在栈上分配内存开销大得多。操作系统还需要执行一些操作来计算并找到适合尺寸的内存块。


17初始内存块,使用memset