1

我对 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 只是一个字符串。

这个吐司让我知道经过的时间是 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)
4

3 回答 3

2

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

于 2013-05-23T22:40:23.603 回答
0

Make sure that variables startTime and endTime are Long

于 2013-05-23T22:53:56.130 回答
0

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

于 2013-05-24T04:36:43.557 回答