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

问题描述 投票:1回答:3

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

ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

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

java android benchmarking cpu-time
3个回答
1
投票

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

SystemClock.currentThreadTimeMillis(); 

Android documentation指出此方法

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


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 */ }

0
投票

CPU时间方法

android.os.Debug.threadCpuTimeNanos()

获取线程CPU使用率的指示。返回的值表示当前线程花费在执行代码上的时间或等待某些类型的I / O。时间以纳秒为单位,只有在以下情况下才有意义与先前通话的结果相比。注意纳秒分辨率并不表示纳秒精度。

通过检查Android运行时(ART),这将调用ThreadCpuNanoTime方法,该方法使用CLOCK_THREAD_CPUTIME_ID(这是您所需要的)。同样,它被标记为“ fast Native method”,并在Java中标注为“ @FastNative”。这样可以通过加快JNI转换来优化它。我猜他们是通过不完全构建/销毁JNI环境来完成此操作的,因为这里没有真正的依赖项。它实际上只是一个syscall

SystemClock.currentThreadTimeMillis:

我会选择此选项。

implementation中可以看到它也在使用CLOCK_THREAD_CPUTIME_ID,并将毫微分为毫微秒。同样,有currentThreadTimeMicro。这两个使用@CriticalNative注释,该注释比@FastNative还要快。这种特殊的优化要求该方法不使用对象,仅使用基元,并且是静态的。因此,根本不使用JNIEnv。与@FastNative相似,这些批注仅用于平台调用,不会动态链接,而是预先由框架专门链接。

或者,可以实现一种JNI方法,该方法可以执行相同的操作,但是无法实现更快的JNI处理。

壁钟方法

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

© www.soinside.com 2019 - 2024. All rights reserved.