java - JNI : Is GetIntArrayElements always linear in time?

标签 java c performance java-native-interface time-complexity

因为我想知道是否值得使用JNI 来提高我的应用程序的性能,所以我想知道GetIntArrayElements 的复杂度是多少。它是否总是在 C 中分配一个新的原始数组并从原始 Java 数组中复制所有元素,或者它以某种方式设法传递一个指针?

我想知道是否值得将 JNI 用于线性算法,例如两个 vector 的逐点乘法。如果 GetIntArrayElements 是线性的,我想如果我们需要先复制 vector ,那么使用 C/C++ 的潜在性能提升将会丢失。

最佳答案

GetIntArrayElements有一个名为 isCopy 的可选引用参数。当 VM 复制数据供您使用时,此参数将设置为 JNI_TRUE。这个想法是不同的 VM 实现可能有不同的数组内存表示,也可能与 C 期望的内存布局不兼容。

通常在 Java 和 native 代码之间共享内存的最快方法是使用直接 ByteBuffer s(使用 allocateDirect 创建的)。这些缓冲区使用可直接从 C/C++ 使用的底层内存块。

在 Java 中,您创建一个缓冲区并用一些数据填充它:

public static void main(String[] args) {
    byte[] ba = "Hello Wolrd!".getBytes(StandardCharsets.US_ASCII);
    ByteBuffer bb = ByteBuffer.allocateDirect(ba.length + 1); // for terminator
    bb.put(ba);
    callCPP(bb);
}

private static native void callCPP(ByteBuffer bytes);

然后从 C/C++ 中,您可以使用 GetDirectBufferAddress 获取底层字节 block 的地址。 (这是在 C++ 中):

JNIEXPORT void JNICALL Java_Main_callCPP(JNIEnv *env, jclass, jobject buff) {
    const char* str = (char*) env->GetDirectBufferAddress(buff);
    printf(str); // Hello World!
}

使用 ByteBuffer 的缺点是没有数据抽象,就像类的字段有特定类型,字节缓冲区中的位置没有。

关于java - JNI : Is GetIntArrayElements always linear in time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763129/

相关文章:

java - 为什么这会返回 Infinity? ( java )

具有实例方法的 Java 构造函数

c - 向 pthread_create() 发送多个参数

c - c 中的 setenv() 不添加我的自定义 bin 目录

c# - 方法的执行时间在增加,为什么会这样?

python - 将 2-d 矩阵的每一列乘以 3-d 矩阵的每个切片的更有效方法

java - 如何使用 postgis 和 Hibernate Spatial 5.2 正确映射具有 SRID 的多边形

c - 无限的while循环,即使在声明了增量之后

performance - 填充非常大的哈希表-如何最有效地做到这一点?

java - 解码 [] 字节我只得到字符�����