1 介绍
通常,使用一个逻辑简单但比较慢的程序比较好。
因为一个快的程序通常:1. 编写时间长;2. 提速不高,难以察觉;3.可以通过硬件升级达到
不同层次优化:
- 建模 - 算法
- 编码 - 程序/过程
- 编译 - 底层 Low-level
- 执行 - 硬件
- ……
2 The Golden Rules of optimization 黄金准则(优化建模——算法)
良好的算法规则:优化程序的最佳和最重要的方法是使用良好的算法
时间复杂度Asymptotic complexity:衡量算法优劣
(但并不总是效率的适当指标,如底层优化)
3 Optimizing compilers 有优化功能的编译器
提高程序到汇编的映射
- 编译器对代码重排序
- 消除轻微效率低下
不足(妨碍优化的因素)
- 内存别名 memory aliasing
- 不同的指针可能会指向存储器的同一位置
- 不同的指针可能会指向存储器的同一位置
- 函数副作用
- 编译器不会判断一个函数是否有副作用,它会假设最糟的情况,并保持所有的函数调用不变
- 编译器不会判断一个函数是否有副作用,它会假设最糟的情况,并保持所有的函数调用不变
4 Example of optimizing program
表达性能:每元素的周期数(CPE,cycle per element),在这里元素指的是代码块
名字 | 情况 | 代码 | 备注 |
---|---|---|---|
combine1 | 未优化 | 将v的所有元素求和,存到dest | |
combine2 | eliminating loop inefficiencies消除低效循环 | 代码移动code motion | |
combine3 | reducing procedure calls 减少过程调用 | ||
combine4 | eliminating unneeded memory references消除不需要的内存引用(内存读写花费高) |
5 General optimization techniques [self study]
- 编译时,选择优化选项
- 编码时
单击优化
更快的数学
更快的循环
避免表达式重复
使用汇编
使用寄存器
整数
指针取消引用
避免临时变量
字符串比较
++/–放在前面比放在后面块
按值调用 VS 按引用调用
重用代替重新分配
使用 switch()代替if-else
循环中尽早break