Java 为什么SetObjectField这么慢?
因此,我在平板电脑上对JNI功能进行基准测试(平均超过3x5000次调用),每次调用的时间: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
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;