Java 为什么SetObjectField这么慢?

Java 为什么SetObjectField这么慢?,java,android,java-native-interface,Java,Android,Java Native Interface,因此,我在平板电脑上对JNI功能进行基准测试(平均超过3x5000次调用),每次调用的时间: SetObjectField 0.35 milliseconds NewStringUTF 0.03 milliseconds GetObjectField 0.003 milliseconds SetBooleanField 0.002 milliseconds SetObjectArrayElement 0.002 milliseconds

因此,我在平板电脑上对JNI功能进行基准测试(平均超过3x5000次调用),每次调用的时间:

SetObjectField        0.35 milliseconds
NewStringUTF          0.03 milliseconds
GetObjectField        0.003 milliseconds
SetBooleanField       0.002 milliseconds 
SetObjectArrayElement 0.002 milliseconds 
因此,SetBooleanField、SetObjectArrayElement和GetObjectField都是合理快速的;NewStringUTF必须很慢,因为它正在分配新的内存;但是SetObjectField能做什么呢?这需要这么长时间?它不仅仅是在已知位置写入指针吗?是到处都慢,还是只在我的旧安卓4.4平板电脑上慢?CheckJNI已启用(“延迟启用CheckJNI”),这会改变情况吗

Pascal中的基准代码:

for i := 1 to 3 do begin
  starttime := now;
  for k := 1 to 5000 do  
    env^^.SetObjectField(env, jbook, bookFields.accountL, jacc);
  log('TESTING TIME: ' + inttostr(round( (now - starttime)*MSecsPerDay)));
end;


jbook
jacc
bookClass
bookFields.accountL
使用我的应用程序中的对象/类/字段进行初始化。而且它们不是
nil
/null(使用nil SetObjectField是快速的)。我手动进行平均。

显示您的基准代码。我怀疑这些结果的真正原因是您的基准测试有问题。@StephenC添加了相关的循环抱歉,但我们需要查看完整的基准测试。在你的问题中给出结果的基准测试的实际代码。好吧,我把它放在我的应用程序中的for循环上面,然后更改了内部k循环。有一些关于JNI的问题,它给出了您向我展示的东西,但这并不能让我相信您的基准测试是可靠的。我看不到任何东西可以说明如何处理JVM预热效应。没有这个,我们可能只是在追逐海市蜃楼。。。您基准测试方式的产物。另外,我不认为其他任何人能够可靠地复制您的结果,因为您的技术似乎是更改代码并重新运行它。其他人可能已准备好与/从此。。。
javaarray := env^^.NewObjectArray(env, 5001, bookClass, nil); 
for i := 1 to 3 do begin
  starttime := now;
  for k := 1 to 5000 do  
    env^^.SetObjectArrayElement(env, javaarray, k, jbook);
  log('TESTING TIME: ' + inttostr(round( (now - starttime)*MSecsPerDay)));
end;