java - 使用 currentTimeMillis 测量耗时返回 0

标签 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。我没有返回任何东西,因为我试图将它的性能与使用 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/

相关文章:

java - BrowserMob 代理不会将 https 资源列入黑名单

java - 安卓定时通知报错

android - 如何使我的 Android 应用程序符合加州消费者隐私法?

javascript - Javascript 是否在加载时被解析/解释? (IE)

java - 如何在arCore平面中设置3d模型而无需点击

java - java main方法是一个线程吗?

android - USB权限没有提示

sql - 如何清除 Sql Server 2005 中的连接

javascript - 如何在 javascript 中更快地查询一长串数据?

java - ExpandableListView 对于列表中的最后一项表现异常