После сбора множества трассировок с помощью ProfilingManager , их индивидуальное изучение для выявления проблем с производительностью становится нецелесообразным. Анализ трассировок в пакетном режиме позволяет одновременно запрашивать набор данных трассировок для:
- Выявите распространенные причины снижения производительности.
- Рассчитайте статистические распределения (например, латентность P50, P90, P99).
- Найдите закономерности в нескольких трассах.
- Найдите аномальные значения в трассировках, чтобы понять и отладить проблемы с производительностью.
В этом разделе показано, как использовать обработчик пакетных трассировок Perfetto Python для анализа метрик запуска по набору локально сохраненных трассировок и выявления аномальных трассировок для более глубокого анализа.
Составьте запрос
Первым шагом для проведения массового анализа является создание запроса PerfettoSQL.
В этом разделе мы приводим пример запроса для измерения задержки запуска приложения. В частности, вы можете измерить продолжительность от activityStart до первого сгенерированного кадра (первого появления фрагмента Choreographer#doFrame ), чтобы оценить задержку запуска приложения, которая находится под контролем вашего приложения. На рисунке 1 показан раздел для запроса.

CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
(SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
WHERE startToEndDur > 0)
GROUP BY name, ts;
SELECT ts,name,dur from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)
Вы можете выполнить запрос в пользовательском интерфейсе Perfetto , а затем использовать результаты запроса для создания отладочной дорожки (рис. 2) и ее визуализации на временной шкале (рис. 3).


Настройте среду Python.
Установите Python и необходимые библиотеки на свой локальный компьютер:
pip install perfetto pandas plotly
Создайте скрипт для анализа трассировки пакетов.
Приведенный ниже пример скрипта выполняет запрос в нескольких трассировках, используя Python BatchTraceProcessor из библиотеки Perfetto .
from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px
# Collect all trace files in the local directory
traces = glob.glob('*.perfetto-trace')
if not traces:
print("No .perfetto-trace files found in the current directory.")
exit(1)
if __name__ == '__main__':
# Process all traces in parallel to aggregate metrics across runs
with BatchTraceProcessor(traces) as btp:
query = """
CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
(SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
WHERE startToEndDur > 0)
GROUP BY name, ts;
SELECT ts,name,dur / 1000000 as dur_ms from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)
"""
df = btp.query_and_flatten(query)
# Plot the distribution of startup times, tracking trace file paths on
# hover
violin = px.violin(df, x='dur_ms', hover_data='_path', title='startup time', points='all')
violin.show()
Разберитесь в сценарии.
При запуске скрипта на Python выполняются следующие действия:
- Скрипт выполняет поиск во локальной директории всех трассировок Perfetto с расширением
.perfetto-traceи использует их в качестве исходных трассировок для анализа. - Он выполняет пакетный запрос трассировки, который вычисляет подмножество времени запуска, соответствующее времени от фрагмента трассировки
activityStartдо первого кадра, сгенерированного вашим приложением. - Программа отображает задержку в миллисекундах, используя скрипичный график для визуализации распределения времени запуска.
Проанализируйте результаты.

После выполнения скрипта он генерирует график. В данном случае график показывает бимодальное распределение с двумя отчетливыми пиками (Рисунок 4).
Далее найдите разницу между двумя группами данных. Это поможет вам более детально изучить отдельные трассы. В этом примере график настроен таким образом, что при наведении курсора на точки данных (задержки) можно определить имена файлов трасс. Затем вы можете открыть одну из трасс, входящих в группу с высокой задержкой.
When you open a trace from the high-latency group (Figure 5), you will find an extra slice named MyFlaggedFeature running during startup (Figure 6). Conversely, selecting a trace from the lower-latency population (the leftmost peak) confirms the absence of that same slice (Figure 7). This comparison indicates that a specific feature flag, enabled for a subset of users, triggers the regression.



Этот пример демонстрирует один из многих способов использования анализа массивов данных. Другие варианты применения включают извлечение статистических данных с мест для оценки воздействия, выявление регрессий и многое другое.