Android NDK vs iOS – 性能问题
我一直在寻找解决方案至少2天不成功,所以我最后的希望我决定在这里问。
在这里,我们有一个使用OpenCV的C ++代码库,我们希望在iOS和Android上运行。 事实certificate,整个事情在Android上运行较慢,我找不到原因。 在分析之后,我们知道调用C ++代码的方法是两个平台上完全相同的问题。 在Android(三星Galaxy S4)上,在iOS(iPhone 5)上执行需要140-150毫秒才能达到70毫秒。 我读过一些关于优化本机代码和使用不同local_cflags的文章但似乎没有帮助。
这是一个需要被接受的事实还是有解决方案? 迈克,提前谢谢你
您的经历与我的相关性很好。 根据我在iOS和Android上使用OpenCV的经验(在我的案例中使用Nexus 4):
-
如果您只使用单线程代码,Android通常会更慢。 Apple CPU核心比我在Android手机上测试的任何核心都快(参见在线提供的许多电话评论),而最新的Android手机有4个或更多核心。 在iOS上,OpenCV使用GCD并行运行一些算法,但在Android上它不使用OpenMP(这是替代方案,但仅适用于GCC 4.x,而不是Clang)。 遗憾的是,在主线程之外使用OpenMP是一件痛苦的事。 这个bug仍然出现在NDK的r10中,所以要么你用补丁重新编译工具链,要么你被困在主线程上,这不是重度计算的最佳选择。
-
默认情况下,Android上的OpenCV是使用Thumb指令编译的,这些指令速度较慢。 我建议重新编译它将ARM模式设置为ON和NEON。
-
自动向量化标志。 如果在NDK上使用GCC,则必须使用-O3 ,加上-funsafe-math-optimizations来启用NEON的自动向量化 。
-
限制CPU频率。 我的Nexus 4似乎比iOS更热情地控制CPU频率。 我们已经看到Android代码的时序大幅波动,在iOS上以非常稳定的时序运行,我们能想到的唯一原因是CPU频率。 Renderscript(请参阅此答案 )最大化CPU频率,但电池寿命将受到影响(并且您必须重写代码)。