做了几个月的移动端算法性能加速,略有心得,这里做个小结。
性能加速,即对于给定的输入,用更短的时间获得我们想要的输出。
总的来说有两个思路:
- 降低计算量
- 提高计算速度。
各种优化技术基本上都是围绕这两点展开的。
降低计算量
- 优化算法或模型,使得用更少的计算量就可以达到同样的效果
- 简化算法或模型,使得在牺牲部分准确度或效果的情况下速度能有大幅提升,看应用场景
- 算法本身不变,优化实现。或将算法中可能存在的重复计算抽离出来,结果进行复用,或其它tricks
- 空间换时间,如查表
提高计算速度
- 增加计算并行度,如多线程/进程
- SIMD向量化
- 代码层面fine tune,如考虑缓存命中,浮点转定点,流水线优化
- 提高硬件性能,或采用更高性能的计算单元
还有一些特殊情况,要根据特定的应用场景来做加速,通用的加速是较困难的,要做到在所有输入条件下都能有理想的提升不容易,因此可以退而求其次,只针对常用的几种情况进行有针对性的加速,如限定网络大小,限定图像缩放倍数,限定光流窗口大小等。这样的加速依然是有效的,脱离业务层面的加速是没有太大必要的,技术是为业务服务的。