Лучший способ измерения времени выполнения в 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.
Ответ 3
То, о чем вы просите, называется profiling, и есть инструменты, которые помогут вам в этом и на Android. См. Статью Профилирование с помощью Traceview и dmtracedump на официальном сайте разработчика.