【发布时间】:2013-05-19 11:13:55
【问题描述】:
我对 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)
【问题讨论】:
-
确保
java_doubleinterp有副作用。 -
副作用是什么意思?如果我将 setTextview(ans) 放在 endTime 之前,我会得到正确的值还是只是 setTextview() 的经过时间?
标签: java android performance time elapsedtime