【发布时间】:2012-06-27 04:03:13
【问题描述】:
我使用OpenCV 为iOS 完成了计算密集型应用程序。当然,它很慢。但它比我的 PC 原型慢 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"。一些博客文章建议完全相反,但这是因为拇指在armv6上通常会使事情变慢。armv7没有任何问题,让事情变得更快更小。为了确保拇指优化和
-mfpu=neon最多可以工作并且不引入崩溃,我完全删除了 armv6 目标。我所有的代码都编译为armv7,这也被列为应用商店的要求。这意味着iPhone的最小值将是3GS。我认为放弃旧的是可以的。无论如何,旧设备的 CPU 速度较慢,如果安装在旧设备上,CPU 密集型应用程序会提供糟糕的用户体验。我当然用
-O3 flag我从 OpenCV 中删除了
"dead code"。通常在优化 OpenCV 时,我会看到我的项目显然不需要的代码。例如,通常有一个额外的"if()"来检查像素大小是 8 位还是 32 位,我知道我只需要 8 位。这会删除一些代码,为优化器提供更好的机会来删除更多内容或替换为常量。代码也更适合缓存。
还有其他技巧和想法吗?对我来说,启用拇指并用查找替换三角函数是助推器,让我感到惊讶。也许您知道更多可以让应用飞起来的事情?
【问题讨论】: