Лучший способ измерения времени выполнения в Android?

Каков наилучший метод для измерения времени выполнения фрагмента кода Android?

У меня есть раздел кода до и после которого я хочу поместить временные метки, чтобы узнать время его выполнения (например, одно в onCreate() и другое в onDestroy()).

Я пробовал Time.toMillies(false), но он возвращает мне только секунды (с константой 000 в конце). Я также попробовал две java-функции: System.currentTimeMillis() и System.nanoTime(). Первый возвращает миллисекунды времени эпохи, второй - нет.

Каким будет лучший способ измерения времени выполнения и получения хорошей точности?

Ответ 1

Как насчет TimingLogger?

Из TimingLogger документация:

TimingLogger timings = new TimingLogger(YOUR_TAG, "methodA");
// ... do some work A ... 
timings.addSplit("work A");
// ... do some work B ... 
timings.addSplit("work B");
// ... do some work C ... 
timings.addSplit("work C");
timings.dumpToLog();

и дамп будет выглядеть так:

     D/TAG     ( 3459): methodA: begin
     D/TAG     ( 3459): methodA:      9 ms, work A
     D/TAG     ( 3459): methodA:      1 ms, work B
     D/TAG     ( 3459): methodA:      6 ms, work C
     D/TAG     ( 3459): methodA: end, 16 ms

Не забудьте включить свой тег: adb shell setprop log.tag.YOUR_TAG VERBOSE

Ответ 2

Каким будет лучший способ измерения времени выполнения

System.nanoTime(), вероятно, является хорошим выбором. Например, Джейк Уортон использует Hugo.

и получить хорошую точность

Это не совсем возможно, так как на вашем устройстве может случиться что-либо, пока ваш метод выполняется. Эти внешние факторы будут влиять на ваши измерения времени, краду процессорного времени, связывание каналов ввода-вывода и т.д. Вам нужно усреднить ваши тесты на нескольких трассах, чтобы попытаться усреднить эти внешние факторы, а точность/точность будут страдать как результат.

И, как отмечает Марцин Орловский, чтобы выяснить, почему вы потребляете определенное количество времени, используйте Traceview.