JNI:可以避免在JNI中创建大量Java对象吗?

JNI:可以避免在JNI中创建大量Java对象吗?,java,java-native-interface,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 = en

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

    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);
    }
jclass-segWordClazz=env->FindClass(“xxx/yyy/SegWord”);
jmethodID initMethodId=env->GetMethodID(segWordClazz,”,“(Ljava/lang/String;II)V”);
jsize size=(jsize)words.size();
jobjectArray arr=env->NewObjectArray(大小,segWordClazz,NULL);
jint i=0;
对于(i=0;iNewStringUTF(words[i].word.c_str());
jobject obj=env->NewObject(segWordClazz、initMethodId、word、,
(jint)字[i]。unicode\u偏移量,
(jint)字[i].unicode\u偏移量+字[i].unicode\u长度);
环境->设置对象数组元素(arr、i、obj);
env->DeleteLocalRef(obj);
env->DeleteLocalRef(word);
}
我想做的是,将文本拆分为单词,但是如果文本太长,它可能会生成太多的单词,从而导致大量的
NewObject
分配(100万或200万可能更多)


我想知道是否有可能提高这里的性能?这段代码的执行时间太长。

您的代码正在按顺序迭代和处理某些输入

我不知道如何减少对象占用(因为我不知道您的需求-您没有解释为什么要这样做)


<> P>但对于整个运行时:考虑将“输入”数据分割成几个“分区”,这将使您可以并行运行。这甚至会增加内存消耗,但应该允许更快的处理。

这里是正确的,内存减少似乎是不可能的,只是删除它。“无论如何,一个问题中的问题在这里是不被鼓励的:-)你的意思是,你的arr的长度超过一百万,而且填充它需要太长的时间?你怀疑NewObject是应该优化的步骤?SegWord构造函数有什么特别的功能吗?您应该首先分析代码以找到瓶颈。您有多确定JNI中的对象创建是您的性能瓶颈?如果要解析那么多文本,瓶颈可能是I/O或解析。永远不要猜测你需要优化的地方——你很可能是错的。对性能进行基准测试和衡量,以发现瓶颈。