Как я могу измерить удельное время потока в Android?

В стандартной JVM (например, версия 1.8) мы можем получить доступ ко времени текущего потока следующим образом:

ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

Какова эквивалентная методология для получения текущего времени потока в Android (т.е. Dalvik VM).

2 ответа

Решение

Итак, я нашел это решение в Android:

SystemClock.currentThreadTimeMillis(); 

В документации Android говорится, что этот метод

Возвращает миллисекунды, запущенные в текущем потоке.

android.os.Debug.threadCpuTimeNanos()

Получите информацию об использовании потокового процессора. Возвращаемое значение указывает количество времени, которое текущий поток потратил на выполнение кода или ожидание ввода / вывода определенных типов.

Время выражается в наносекундах и имеет смысл только по сравнению с результатом более раннего вызова. Обратите внимание, что наносекундное разрешение не подразумевает наносекундную точность.

В системе, которая не поддерживает эту операцию, вызов возвращает -1.

После этого собственного вызова в среде выполнения Android он вызывает метод ThreadCpuNanoTime, который использует CLOCK_THREAD_CPUTIME_ID, то, что вам нужно.

Кроме того, вы можете реализовать это как метод JNI, который делает то же самое. Это может иметь дополнительные издержки, поскольку внутренний метод может быть помечен как "быстрый вызов JNI". Это означает, что среда выполнения знает, что делает этот конкретный C-код, поэтому она не полностью создает / разрушает среду JNI.

Настенные часы приближаются

И то и другое System.nanoTime(), а также currentTimeMillis() не связаны с потоком, а использовать CLOCK_MONOTONIC,

Я не знаком с любым подобным эквивалентом в API Java.

однако, выходя за рамки Java API... не могли бы вы извлечь какую-либо полезную информацию из top?

top -t очевидно, будет включать в отчет информацию, относящуюся к конкретным потокам. вот результат работы на одном из моих устройств:

там, по-видимому, имеются данные о потоке и загрузке процессора.

получение доступа к этому выводу потребовало бы некоторой примитивной формы обработки входного потока, например

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 */ }
Другие вопросы по тегам