使用currentTimeMillis测量经过的时间返回0

时间:2013-05-23 22:37:48

标签: java android performance time elapsedtime

我对Java / Android编程有些新意,我只是想做一个简单的时间测量来计算我正在调用的方法的经过时间。

现在我的代码看起来像这样:

        startTime = System.currentTimeMillis();
        java_doubleinterp(args, ans);
        endTime = System.currentTimeMillis();
        elapsed = endTime - startTime;
        setTextview(ans);

方法 java_doubleinterp 包含一个for循环,它纯粹是数学的并且工作正常。输入为 args ,输出为 ans 。我没有返回任何东西,因为我试图将它的性能与使用MatLab自动生成的具有此结构的C / C ++(NDK)实现的类似函数进行比较。

对于C / C ++函数,我试图以相同的方式测量时间并得到相同的错误。

稍后在代码中我有这个:

Toast elapsedTime = Toast.makeText(getApplicationContext(), 
            "Elapsed time for " + lang + " code: \n" + (elapsed*1000)+ "\u03BCs", 
            Toast.LENGTH_LONG);

其中lang只是一个字符串。

这个吐司让我觉得经过的时间是0(微秒)。

我在尝试调试此问题时显示了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 ms(Java)/ 6.59 ms(JNI)
  • Nexus 4:1.11ms(Java)/ 0.82 ms(JNI)

3 个答案:

答案 0 :(得分:2)

你正在尝试衡量一个虚拟例程的性能:可能性是编译器只是让整个事情消失了,这就是你得到0微秒的原因。

答案 1 :(得分:0)

确保变量startTime和endTime为Long

答案 2 :(得分:0)

您的例程看起来非常快,因此开始时间和结束之间的差异为0.当我们测量性能时,据我所知,nanoTime()比currentTimeMillis()要好得多。尝试增加输入的大小