我对 Java/Android 编程有些陌生,我只是想做一个简单的时间测量来计算我正在调用的方法的耗时。
现在我的代码是这样的:
startTime = System.currentTimeMillis();
java_doubleinterp(args, ans);
endTime = System.currentTimeMillis();
elapsed = endTime - startTime;
setTextview(ans);
java_doubleinterp 方法包含一个 for 循环,它是纯数学的并且可以正常工作。输入是args,输出是ans。我没有返回任何东西,因为我试图将它的性能与使用 C/C++ (NDK) 实现的类似函数进行比较,该函数是使用 MatLab 自动生成并具有此结构。
对于 C/C++ 函数,我尝试以相同的方式测量时间并得到相同的错误。
稍后在代码中我有这个:
Toast elapsedTime = Toast.makeText(getApplicationContext(),
"Elapsed time for " + lang + " code: \n" + (elapsed*1000)+ "\u03BCs",
Toast.LENGTH_LONG);
其中 lang 只是一个字符串。
这个 toast 告诉我耗时是 0us(微秒)。
我在尝试调试此问题时显示了 startTime 和 endTime,它们确实显示了相同的值。为什么会这样?
Obs:我尝试使用 nanoTime() 来获取时间并获得更高的精度,但结果是:
- 模拟器:大约 50us
- 电话 (Nexus 4):0us 或 30us [没有意义]
编辑:
我对我的代码进行了一些更改,现在 java 方法看起来像这样:
startTime = System.nanoTime();
java_doubleinterp(args, ans);
setTextview(ans);
endTime = System.nanoTime();
elapsed = endTime - startTime;
这是 c 函数 (JNI) 的部分:
startTime = System.nanoTime();
doubleinterp(args, ans);
setTextview(ans);
endTime = System.nanoTime();
elapsed = endTime - startTime;
他们现在工作正常。由于setTextview对于两部分代码是同一个方法,绝对执行时间可能是错误的,但相对执行时间(在java实现和JNI实现之间)是可以的。
现在我得到了更有意义的平均执行时间:
- 模拟器:3.75 毫秒(Java)/6.59 毫秒(JNI)
- Nexus 4:1.11 毫秒(Java)/0.82 毫秒(JNI)
最佳答案
您正在尝试测量虚拟例程的性能:编译器很可能只是让整个过程消失,这就是为什么您得到 0 微秒的原因。
关于java - 使用 currentTimeMillis 测量耗时返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16725025/