~~~~我的生活,我的点点滴滴!!
整理自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