如何在Android中测量线程特定时间?

时间:2017-06-27 20:45:54

标签: java android benchmarking cpu-time

在标准JVM(例如,版本1.8)中,我们可以像这样访问当前线程的时间:

ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

在Android(即Dalvik VM)中获取当前线程时间的等效方法是什么。

3 个答案:

答案 0 :(得分:0)

我不熟悉Java API中的任何等效内容。

超越Java API思考,但是......你能从top收集任何有用的信息吗?

top -t显然会在报告中包含特定于线程的信息。这是在我的一台设备上运行的结果:

enter image description here

似乎有可用的线程和CPU利用率数据。

访问此输出将涉及一些原始形式的输入流处理,例如

try {
    final String cmd = "top -t"

    final Process ps = Runtime.getRuntime().exec(cmd);
    ps.waitFor();

    final InputStream instream = ps.getInputStream();

    ...

} catch(Throwable t) { /* handle errors */ }
} finally { /* clean-up */ }

答案 1 :(得分:0)

所以,我在Android中找到了这个解决方案:

SystemClock.currentThreadTimeMillis(); 

Android documentation表示此方法

  

返回当前线程中运行的毫秒数。

答案 2 :(得分:0)

android.os.Debug.threadCpuTimeNanos()

  

获取线程CPU使用率的指示。返回的值表示   当前线程花费在执行代码上的时间或   等待某些类型的I / O。

     

时间以纳秒表示,仅在以下情况下有意义   与先前通话的结果相比。注意纳秒   分辨率并不表示纳秒精度。

     

在不支持此操作的系统上,调用返回-1。

在Android运行时中执行本机调用之后,它会调用ThreadCpuNanoTime方法,该方法使用您需要的CLOCK_THREAD_CPUTIME_ID

或者,您可以将其实现为执行相同操作的JNI方法。但是,这可能会产生额外的开销,因为内部方法可能被标记为“快速JNI”调用。这意味着,运行时知道特定的C代码在做什么,因此它无法完全构造/破坏JNI环境。

壁钟临近

System.nanoTime()currentTimeMillis()均未绑定到线程,并使用CLOCK_MONOTONIC