【问题标题】:Android NDK vs iOS - performance issue [closed]Android NDK vs iOS - 性能问题[关闭]
【发布时间】:2014-09-03 10:07:43
【问题描述】:

我一直在寻找解决方案至少 2 天没有成功,所以作为我最后的希望,我决定在这里问它。

在工作中,我们有一个使用 OpenCV 的 C++ 代码库,我们想在 iOS 和 Android 上运行。事实证明,整个事情在 Android 上运行速度较慢,我找不到原因。在分析之后,我们知道调用 C++ 代码的方法是两个平台上完全相同的问题。在 Android(Samsung Galaxy S4)上执行需要 140-150 毫秒,而在 iOS(iPhone 5)上则不到 70 毫秒。 我已经阅读了一些关于优化本机代码和使用不同 local_cflags 的文章,但似乎没有帮助。

这是需要承认的事实还是有解决方案? 提前谢谢你,迈克

【问题讨论】:

  • 这是两个不同的 CPU。性能差异不大,高端品牌速度更快。对我来说并不奇怪。请注意,Android 手机会更慢;一些中国仿冒品可能会慢 10 倍。
  • 这是事实,但 Galaxy S4 的 CPU 规格更好。看起来没关系。
  • 确保您使用的是 armeabi-v7a 版本,而不仅仅是普通的 armeabi 版本。普通的 armeabi 构建不使用 FPU,因此如果代码使用大量浮点数,则性能非常有限。 (对于整数运算,差异不应该那么大。)
  • 很遗憾我正在使用 armeabi-v7a
  • 您无法通过该问题陈述获得有用的答案。您不妨阅读Pro Android Apps Performance Optimizations

标签: android c++ ios android-ndk


【解决方案1】:

您的经历与我的经历非常吻合。根据我在 iOS 和 Android 上使用 OpenCV 的经验(在我的例子中是 Nexus 4):

  1. 如果您只使用单线程代码,Android 通常会比较慢。 Apple CPU 内核比我在 Android 手机上测试过的任何内核都快(请参阅网上的许多手机评论),而最新的 Android 手机有 4 个或更多内核。在 iOS 上,OpenCV 使用 GCD 并行运行一些算法,但在 Android 上它不使用 OpenMP(这是替代方案,但仅适用于 GCC 4.x,而不适用于 Clang)。可悲的是,在主线程之外使用 OpenMP 很痛苦。 This bug 仍然存在于 NDK 的 r10 中,因此要么使用补丁重新编译工具链,要么卡在主线程上,这不是繁重计算的最佳选择。

  2. 默认情况下,Android 上的 OpenCV 使用较慢的 Thumb 指令编译。我建议重新编译它,将 ARM 模式设置为 ON 和 NEON。

  3. 自动矢量化标志。如果您在 NDK 上使用 GCC,则必须使用 -O3-funsafe-math-optimizations 来启用 NEON 的自动矢量化。

  4. 限制 CPU 频率。我的 Nexus 4 似乎比 iOS 更积极地限制 CPU 频率。我们已经看到在 iOS 上以非常稳定的时间运行的 Android 代码的时间大幅波动,我们能想到的唯一原因是 CPU 频率。 Renderscript(请参阅this answer)最大化 CPU 频率,但电池寿命会受到影响(并且您必须重写代码)。

【讨论】:

  • 某些 OEM(例如 qualcomm)在 CPU 节流方面非常激进。您可以通过在测试运行时连续在屏幕上拖动手指来判断这是否是一个问题——算法的一部分是在检测到触摸更新时保持时钟较高,以便设备在交互时感觉响应。可能还值得研究 r9b (stackoverflow.com/questions/3004915/…) 中发生的硬浮动变化,尽管我怀疑这会让你获得超过 10% 左右。
  • 我在几个网站上读到了关于霓虹灯的信息,他们说要使用不同的 cflags,但它似乎不起作用。我错过了什么吗?我是否必须更改我的代码才能获得霓虹灯的提升?我忘了写 C++ 代码使用 4 个线程,所以 1) 可能无济于事。 2) 和 3) 带回了希望,尽管我已经添加了 -O3 标志。所以问题是霓虹灯是如何工作的?
  • 如果对代码一无所知,就很难说出为什么你的代码变慢了。你做过剖析吗?哪些部分最慢? NEON 相当于 x86 机器上的 SSE/AVX。这意味着如果编译器不为您的代码向量化,您将不得不自己做,或者使用已经有 NEON 实现的库。
  • 是的,我已经完成了。我发现我可以在 CMakeLists.txt 中使用带有标志的 NEON 编译 openCV。另一个问题是我必须将 NEON 代码应用到我自己的 C++ 库还是自动调用?
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多