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