Страница разработчика Android: понимание примера профилирования трассировки

Я смотрю на этой странице: Профилирование с Traceview и dmtracedump

В разделе "Панель профиля" имеется следующий текст, который ссылается на пример результата профилирования под текстом:

Последний столбец в таблице показывает количество вызовов этого метода плюс количество рекурсивных вызовов. В последнем столбце показано количество вызовов из общего числа вызовов, сделанных для этого метода. В этом представлении мы можем видеть, что было 14 вызовов LoadListener.nativeFinished(); просмотр панели времени показывает, что один из этих вызовов занял необычно много времени.

Я смущен этим описанием. Во-первых, первые два предложения в этой цитате относятся к одному и тому же столбцу. Так что же на самом деле содержит этот последний столбец? Во-вторых, я не понимаю, где именно на "панели шкалы времени" мне нужно посмотреть, чтобы увидеть, что она "показывает, что один из этих вызовов занял необычно много времени".

Не могли бы вы помочь мне разобраться в этом тексте.

1 ответ

Во-первых, эта же статья говорит нам, что:

Родители показаны с фиолетовым фоном и дети с желтым фоном

Таким образом, LoadListener.nativeFinished является родительской функцией, и все строки с отступами под ней являются дочерними, или функциями, которые вызвал родительский объект.

Панель профиля

Вот клип панели профиля из статьи:

Клип панели профиля

Последний столбец в таблице показывает количество вызовов этого метода плюс количество рекурсивных вызовов.

Последний столбец первой строки (родительский) указывает количество вызовов и рекурсивных вызовов, выполненных этой функции: 14 итеративных и 0 рекурсивных вызовов, разделенных символом плюса (14 + 14).

Я думаю, что автор статьи случайно несколько слов и, как следствие, следующая строка немного сбивает с толку:

В последнем столбце показано количество вызовов из общего числа вызовов, сделанных для этого метода.

В дочерних строках с желтым фоном под родительским элементом последний столбец фактически не указывает Calls+Rec. Обратите внимание на изменение в нотации - используется дробь по сравнению с синтаксисом символа плюс. В случае LoadListener.tearDown 14/14 указывает, что LoadListener.tearDown был вызван родительской функцией 14 раз. Функция LoadListener.tearDown была вызвана в общей сложности 14 раз в этой трассировке, следовательно, LoadListener.nativeFinished - единственная функция, которая вызвала LoadListener.tearDown в этой трассировке.

Давайте посмотрим на другой ряд. Последний столбец (дочерней) функции View.invalidate имеет значение 2413/2853. Это не означает, что View.invalidate вызывался 2413 раз итеративно и 2853 раза рекурсивно. Вместо этого это означает, что родительская функция LoadListener.nativeFinished вызывала View.invalidate 2413 раз.

Теперь взгляните на строку № 6, и вы увидите, что View.invalidate вызывался 2853 раза итеративно и 0 раз рекурсивно. Поэтому родительская функция LoadListener.nativeFinished является единственной функцией, которая когда-либо вызывала LoadListener.tearDown в этой трассировке.

Панель шкалы времени

Вот клип панели временной шкалы из статьи:

Клип панели временной шкалы

Из той же статьи,

Тонкие линии под первой строкой показывают экстент (вход в выход) всех вызовов выбранного метода

Обратите внимание на тонкие, похожие на скобки розовые линии, которые проходят горизонтально прямо под выделенным участком главной нити. Крайние левые розовые скобки очень короткие; они представляют 13/14 вызовов к LoadListener.nativeFinished, которые завершались относительно быстро. Последняя скоба - самая дальняя справа - значительно длиннее, чем любая другая. Это вызов LoadListener.nativeFinished, который "занял необычно много времени".

Другие вопросы по тегам