为什么SetObjectField这么慢?

时间:2018-08-11 20:09:44

标签: 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 

因此,SetBooleanField,SetObjectArrayElement和GetObjectField相当快; NewStringUTF必须很慢,因为它正在分配新的内存。但是SetObjectField可能需要那么长时间呢?不仅仅是在已知位置写指针吗?它到处都慢吗,还是只在旧的Android 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;

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;

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

0 个答案:

没有答案