2014-05-28 6 views
10

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

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

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

Что было бы лучшим способом измерить время выполнения и получить точную точность?

ответ

4

Что вы спрашиваете, называется profiling, и есть инструменты, которые помогут вам в этом и на Android. См. Статью Profiling with Traceview and dmtracedump на официальном сайте разработчика.

+0

полностью согласен, хотя в режиме профилирования приложение медленнее, информация о потоке, методах и процентах времени, потраченного на них, стоит того. В противном случае я бы сказал, что System.currentTimeMillis() - это то, что он хочет. – shalafi

7

Что бы лучший способ измерения времени выполнения

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

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

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

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

30

Что относительно 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

+0

Спасибо за отзыв о 'setprop'. Я не понимаю, почему «VERBOSE» необходимо, когда 'dumpToLog()' использует 'Log.d()', но, по-видимому, это. – LarsH

+0

'adb shell setprop log.tag.YOUR_TAG VERBOSE' в вашем примере это' adb shell setprop log.tag.TAG VERBOSE' правильно? Если это так, я не понимаю, почему это не работает. Я не вижу журнала – GabrielOshiro

+0

'YOUR_TAG' в этом примере должна быть любая строка, которую вы использовали для инициализации' TimingLogger'. Пример: 'new TimingLogger (« MyApp »,« methodA »);' use 'adb shell setprop log.tag.MyApp VERBOSE' – friederbluemle

Смежные вопросы