我使用OpenCV
开发了一个计算密集型的iOS应用程序。当然速度很慢。但是相对于我的个人电脑原型,它慢了200倍左右。因此,我进行了优化。从一开始的15秒中,我成功地将速度提高到了0.4秒。我在想是否已经找到了所有可以优化的点,以及其他人可能想分享的内容。我所做的:
将
OpenCV
内部的"double
"数据类型替换为"float
"。Double是64位的,32位的CPU不能轻易处理它们,因此float给了我一些速度。OpenCV经常使用double。将"
-mpfu=neon
"添加到编译器选项中。副作用是模拟器编译器不再工作,任何东西都只能在本机硬件上测试。使用90个值的查找表替换
sin()
和cos()
实现。加速效果非常明显!这与PC相反,因为这样的优化并不能使PC更快。还有一段代码,它的计算单位是角度,而这个值必须转换成弧度才能使用sin()
和cos()
。这段代码也被删除了。但是查找表起到了作用。启用
"thumb optimizations"
。有些博客文章推荐恰恰相反,但这是因为thumb在armv6
上通常会使事情变慢。而armv7
没有任何问题,可以使事情更快,更小。为了确保thumb优化和
-mfpu=neon
发挥最佳效果并且不会引起崩溃,我完全删除了armv6目标。我的所有代码都编译成armv7
,这也被列为应用商店的要求。这意味着最低支持的iPhone
将是3GS
。我认为放弃旧设备是可以接受的。无论如何,旧设备的CPU速度较慢,如果在旧设备上安装CPU密集型的应用程序,会给用户带来糟糕的体验。当然我使用
-O3标志
我从OpenCV中删除了"无用代码"
。通常情况下,当我优化OpenCV时,我发现有些代码明显对我的项目而言是不必要的。例如,经常会有额外的"if()"
语句来检查像素大小是8位还是32位,而我知道我只需要8位即可。这样可以减少一些代码,让优化器更有机会删除更多的代码或者将其替换为常量。同时也可以更好地适应缓存。
还有其他的技巧和想法吗?对我而言,启用thumb模式并使用查找表代替三角函数是加速的关键,让我感到惊喜。也许你知道更多能够使应用程序飞快的方法?