在标准JVM(例如1.8版)中,我们可以像这样访问当前线程的时间:
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
什么是在Android(即Dalvik VM)中获取当前线程时间的等效方法。
所以,我在Android中找到了此解决方案:
SystemClock.currentThreadTimeMillis();
返回当前线程中运行的毫秒数。
我不熟悉Java API中的任何此类等效项。
但是,除了Java API之外...您可以从top
中收集任何有用的信息吗?
top -t
显然将在报告中包含特定于线程的信息。这是在我的一台设备上运行的结果:
那里似乎有线程和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 */ }
获取线程CPU使用率的指示。返回的值表示当前线程花费在执行代码上的时间或等待某些类型的I / O。时间以纳秒为单位,只有在以下情况下才有意义与先前通话的结果相比。注意纳秒分辨率并不表示纳秒精度。
通过检查Android运行时(ART),这将调用ThreadCpuNanoTime方法,该方法使用CLOCK_THREAD_CPUTIME_ID
(这是您所需要的)。同样,它被标记为“ fast Native method”,并在Java中标注为“ @FastNative
”。这样可以通过加快JNI转换来优化它。我猜他们是通过不完全构建/销毁JNI环境来完成此操作的,因为这里没有真正的依赖项。它实际上只是一个syscall。
我会选择此选项。
从implementation中可以看到它也在使用CLOCK_THREAD_CPUTIME_ID
,并将毫微分为毫微秒。同样,有currentThreadTimeMicro。这两个使用@CriticalNative
注释,该注释比@FastNative
还要快。这种特殊的优化要求该方法不使用对象,仅使用基元,并且是静态的。因此,根本不使用JNIEnv
。与@FastNative
相似,这些批注仅用于平台调用,不会动态链接,而是预先由框架专门链接。
或者,可以实现一种JNI方法,该方法可以执行相同的操作,但是无法实现更快的JNI处理。
System.nanoTime()
和currentTimeMillis()
都未绑定到线程,请使用CLOCK_MONOTONIC
。