- 认识到内存别名的存在
- 消除循环的低效率
- 减少过程调用
- 消除不必要的内存引用
消除循环的低效率
为了避免不必要的扯蛋和浪费时间,只挑选有必要的和不破坏代码可读性的地方进行学习
循环优化指南:
如果循环中有要执行多次的值,它又是固定的,最好一次就把它算出来
例如,
for (int i = 0; i < strlen(s); i ++)
{
...
}
就不是一个好的代码
int length = strlen(s);
for (int i = 0; i < length; i ++)
{
...
}
就是一个好代码
这种优化叫做代码移动
编译器会很小心,它不会做任何会改变代码执行结果的优化,所以,程序员必须显式地帮编译器完成代码移动
减少过程调用
过程调用会带来很大的开销
所以要尽量减少过程调用
废话
要在程序的模块性和高性能之间进行精妙的抉择
消除不必要的内存引用
据说这一步能产生显著的性能提升
其实是这么回事:
for (int i = 0; i < length; i ++)
*dest += data[i];
这一句里面会产生很多的内存引用,基本上每一次循环都要对*dest
进行一次内存引用
改成这样子就可以极大地改善运行速度
for (int i = 0; i < length; i ++)
sum += data[i];
*dest = sum;
使用一个临时变量存储运行结果,避免不必要的内存引用,提高运行效率
就是这么简单,小学生都会的东西
扫描二维码关注公众号,回复:
12717358 查看本文章

为什么编译器不会自动产生这种优化呢?
由于内存别名的存在,两个函数可能会有不一样的行为
因此要手动进行这种优化