NDK性能下降

时间:2012-01-29 04:23:44

标签: android android-ndk

我在C中有一个安全库,并尝试使用NDK将其导入我的Android项目。该库依赖于其他三个库:pbc,gmp和openssl。我已经将前两个库构建为静态库,将last one构建为共享库。

我在我的库中定时加密()和decrypt()函数。

在我的笔记本电脑上,它是:

  • encrypt()30ms
  • decrypt()160ms

在我的Android设备(Droid 2.2.3)上,它是:

  • encrypt()190ms
  • decrypt()1300ms

时间仅用于从C库调用这两个函数。 JNI开销非常小。

这是预期的吗?

更新

encrypt()和decrypt()都没有任何IO操作,主要是浮点运算。我编译了armeabi-v7a的代码。

1 个答案:

答案 0 :(得分:7)

首先,我会说你很幸运 - 你的端口工作速度只比笔记本电脑版慢8倍。对于基于ARM的平台来说,这是一个非常好的结果。

ARM有几个原因要慢:

  • ARM处理器的计算能力比英特尔/ AMD台式机CPU低
  • 内存较慢,带宽较低
  • 不同的体系结构限制(例如,浮点单元与ARM中的整数CPU核心分开)

您可以尝试以下方法来改善代码的性能:

  • 如果您的手机具有现代FPU,那么您可以尝试使用其他编译器标记-mfpu=vfpv3(或-mfpu=neon)重新编译所有库。由于FPU寄存器数量增加了一倍,它可以略微提高浮点计算的速度。
  • 尝试使用较新的编译器构建代码。 Latest Crystax NDK这是Google NDK的修改版本,包含gcc 4.6工具链。有时,较新的编译器可以生成更有效的代码。
  • 描述您的代码并优化瓶颈。您可以使用一些特定于ARM的优化技巧(here is有点过时但很好的指导)或使用NEON SIMD转换代码。