Android NDK的性能很慢

Android NDK的性能很慢,android,android-ndk,Android,Android Ndk,我有一个C语言的安全库,并尝试使用NDK将其导入到我的Android项目中。该库依赖于其他三个库:pbc、gmp和openssl。我已经将前两个库构建为静态库和共享库 我对库中的encrypt()和decrypt()函数计时 在我的笔记本电脑上,它是: 加密()30毫秒 解密()160毫秒 在我的Android设备(Droid 2.2.3)上,它是: 加密()190ms 解密()1300ms 该时间仅用于从C库调用这两个函数。JNI开销非常小 这是预期的吗 更新: encrypt()和d

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

我对库中的encrypt()和decrypt()函数计时

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

  • 加密()30毫秒
  • 解密()160毫秒
在我的Android设备(Droid 2.2.3)上,它是:

  • 加密()190ms
  • 解密()1300ms
该时间仅用于从C库调用这两个函数。JNI开销非常小

这是预期的吗

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

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

ARM速度较慢有几个原因:

  • ARM处理器的计算能力比Intel/AMD桌面CPU要低
  • 较慢的内存和较低的带宽
  • 不同的体系结构限制(例如,浮点单元与ARM中的整数CPU核心分离)
您可以尝试以下方法来提高代码的性能:

  • 如果您的手机具有现代FPU,则可以尝试使用附加的编译器标志重新编译所有库
    -mfpu=vfpv3
    (或
    -mfpu=neon
    )。由于FPU寄存器的数量增加了一倍,因此它可以稍微提高浮点计算的速度
  • 尝试使用更新的编译器构建代码。这是谷歌NDK的修改版,包括GCC4.6工具链。有时更新的编译器可以生成更有效的代码
  • 分析代码并优化瓶颈。您可以使用许多特定于arm的优化技巧(有点过时但很好的指南)或NEON SIMD的vertorize代码

这取决于这两个功能的作用。但涉及到什么?你想让我们猜猜你在计算什么?。。。所以,我认为你的笔记本电脑没有比安卓设备更强大的处理器?它所做的是使用SHA256(openssl)和任意精度算法(gmp)加密和解密任意长度的字符数组。请写下你的笔记本电脑中有什么硬件,你有什么手机?这是可能的,因为机器的硬件不同。Android手机的CPU架构与笔记本电脑截然不同。它的加密速度可能不如x86CPU(SSE、SSE2、SSE3等)那么快。我在Nexus S上测试了它,时间减少到原来的一半。Droid的600MHz处理器太慢了:(