做了幾個月的移動端算法性能加速,略有心得,這裏做個小結。
性能加速,即對於給定的輸入,用更短的時間獲得我們想要的輸出。
總的來說有兩個思路:
- 降低計算量
- 提高計算速度。
各種優化技術基本上都是圍繞這兩點展開的。
降低計算量
- 優化算法或模型,使得用更少的計算量就可以達到同樣的效果
- 簡化算法或模型,使得在犧牲部分準確度或效果的情況下速度能有大幅提升,看應用場景
- 算法本身不變,優化實現。或將算法中可能存在的重複計算抽離出來,結果進行復用,或其它tricks
- 空間換時間,如查表
提高計算速度
- 增加計算並行度,如多線程/進程
- SIMD向量化
- 代碼層面fine tune,如考慮緩存命中,浮點轉定點,流水線優化
- 提高硬件性能,或採用更高性能的計算單元
還有一些特殊情況,要根據特定的應用場景來做加速,通用的加速是較困難的,要做到在所有輸入條件下都能有理想的提升不容易,因此可以退而求其次,只針對常用的幾種情況進行有針對性的加速,如限定網絡大小,限定圖像縮放倍數,限定光流窗口大小等。這樣的加速依然是有效的,脫離業務層面的加速是沒有太大必要的,技術是爲業務服務的。