java - Android NDK 是否为通过套接字发送大 int[] 提供加速?

标签 java android performance casting android-ndk

我需要通过两个 Android 设备之间的套接字发送一个包含 500,000 个整数的数组。目前,我花了很多时间将 int[] 转换为 byte[],以便 Java 的套接字可以接受它(请参阅我之前的问题 Efficiently send large int[] over sockets in Java,我们确定没有更快的方法在 Java 中进行类型转换) .

我现在的问题是,如果我采用 int[] 并通过 JNI 将其传递给 Android NDK,我是否可以期望在 native 代码中转换为 byte[] 的速度更快?我知道在普通的 C 中将 int* 类型转换为 char* 非常简单,但是我想知道 JNI 是否会抵消任何性能提升。

此外,一旦我的 native 代码中有一个 byte[],我能否有效地将它传回我的 Java 代码,或者我是否还需要在 C 中实现套接字?

编辑 1:人们在没有点击链接的情况下发布了很多答案。 使用 ByteBuffers 不是一个好的选择,它实际上比 mask-and-shift 慢得多,但仍然比我的性能关键代码需要慢得多!这就是我询问 NDK 的原因。

编辑 2:我更改了上面的文字,说 C 代码可以从 int* 转换为 char*,而不是将 int[] 转换为 byte[]。希望这能澄清问题。

编辑 3:为了阐明我的用例,这是一个研究问题,我在多个设备上分布大量整数并并行对列表进行排序。假设我在 Java 中有 500,000 个整数(不管它们来自哪里)并且我需要尽快通过套接字将它们从设备中取出。说“不要以整数数组开头”的答案没有帮助。此外,我的应用程序代码需要尽可能接近 100% Java。如果 native 类型转换和套接字提高了性能,那没关系,但我不能 native 做任何其他事情(即排序)。

最佳答案

不,使用 JNI/NDK 不会提升性能。首先,当您尝试将数组移交给 native 代码时,您必须复制它或使用直接分配的 ByteBuffer。事实证明,Dalvik VM 的实现总是从 Get*ArrayElements() 返回直接指针。我怀疑您是否会获得性能提升,因为通过 JNI 调用会产生开销成本。最后,C++ 和 Java 在这种情况下的性能非常接近(参见 C++ performance vs. Java/C#)。

查看此问题和第一个答案,了解从 Java 将 int[] 转换为 byte[] 的快速方法 How to convert int[] to byte[]

您使用 int[] 而不是 byte[] 是有原因的吗?如果是图片,我们或许可以推荐避免转换的方法。

关于java - Android NDK 是否为通过套接字发送大 int[] 提供加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395520/

相关文章:

java - 如何解决 "java.lang.UnsatisfiedLinkError: Can' t find dependent libraries"without System32?

java - 使用数据结构在 O(n) 中解决这个问题

Python:比较两个整数列表的最有效方法

java - XML 架构文件到字符串

java - JBoss Drools 从 DRL 插入事实

java - 整个应用程序中的一个插页式广告

使用 ANT 脚本构建 Android NDK

java - 如何让 ScrollView 自动滚动到底部?

performance - grails 从 CDN 提供 index.html

php - 像 CONCAT 与 REGEXP mysql