JNI:是否有可能避免在JNI中创建大量Java对象?

时间:2017-06-19 02:54:38

标签: java java-native-interface

我想在这里提高代码的性能:

    jclass segWordClazz = env->FindClass("xxx/yyy/SegWord");
    jmethodID initMethodId = env->GetMethodID(segWordClazz, "<init>", "(Ljava/lang/String;II)V");

    jsize size = (jsize) words.size();
    jobjectArray arr = env->NewObjectArray(size, segWordClazz, NULL);
    jint i = 0;
    for (i = 0; i < size; i++) {
        jstring word = env->NewStringUTF(words[i].word.c_str());
        jobject obj = env->NewObject(segWordClazz, initMethodId, word,
                                     (jint) words[i].unicode_offset,
                                     (jint) words[i].unicode_offset + words[i].unicode_length);

        env->SetObjectArrayElement(arr, i, obj);
        env->DeleteLocalRef(obj);
        env->DeleteLocalRef(word);
    }

我要做的是将文本拆分为单词,但如果文本太长,可能会生成太多单词导致大量NewObject分配(1或200万可能更多)

我想知道是否有可能改善这里的表现?这段代码需要花费太多时间来执行。

1 个答案:

答案 0 :(得分:0)

您的代码按顺序迭代并处理一些输入。

我看不出你如何减少对象的占用空间(因为我不知道你的要求 - 你不能解释为什么你这样做的事情)。

但是关于整体运行时间:考虑&#34;切片&#34;您的输入数据分成几个分区 - 这将使您能够并行运行。这甚至会增加内存消耗,但应该允许更快的处理。